Как отправить файл в виде вложения электронной почты с помощью командной строки Linux?

Я создал script, который работает каждую ночь на моем Linux-сервере, который использует mysqldump для резервного копирования каждой из моих баз данных MySQL в файлы .sql и упаковывает их вместе как сжатый .tar файл. Следующий шаг, который я хочу выполнить, - отправить этот файл tar через электронную почту на удаленный почтовый сервер для сохранения. Я смог отправить raw script в теле письмо, отправив резервный текстовый файл на mailx следующим образом:

$ cat mysqldbbackup.sql | mailx [email protected]

cat отображает текст файла резервной копии, который отправляется в программу mailx с адресом электронной почты получателя, переданным в качестве аргумента.

В то время как это выполняет то, что мне нужно, я думаю, что это может быть на один шаг лучше, Есть ли способ, используя сценарии оболочки или иначе, отправить сжатый .tar файл в исходящее сообщение электронной почты в виде вложения? Это может привести к тому, что вам придется иметь дело с очень длинными сообщениями электронной почты, которые содержат данные заголовка и часто имеют проблемы с переносом слов и т.д.

Ответ 1

Никто из меня не работал. Он думал, что адрес электронной почты был частью attachemnt. Пришлось делать:

echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- [email protected]

Ответ 2

Или, сбой в mutt:

gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz  | mail -s "MySQL DB" [email protected]

Ответ 3

От взгляда на man mailx программа mailx не имеет опции для прикрепления файла. Вы можете использовать другую программу, такую ​​как mutt.

echo "This is the message body" | mutt -a file.to.attach -s "subject of message" [email protected]

Параметры командной строки для mutt могут быть показаны с помощью mutt -h.

Ответ 4

В зависимости от вашей версии Linux это можно назвать почтой. Чтобы процитировать @David выше:

mail -s "Backup" -a mysqldbbackup.sql [email protected] < message.txt

а также:

cat message.txt | mail -s "Backup" -a mysqldbbackup.sql [email protected] 

Ответ 5

Я использую mpack.

mpack -s subject file [email protected]

К сожалению, mpack не распознает '-' как псевдоним для stdin. Но следующая работа и может быть легко обернута в псевдоним (оболочка) или script:

mpack -s subject /dev/stdin [email protected] < file

Ответ 7

 echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log [email protected]

Ответ 8

Вы можете использовать mutt для отправки электронной почты с вложением

mutt -s "Backup" -a mysqldbbackup.sql [email protected] < message.txt

Ответ 9

Я однажды написал эту функцию для ksh в Solaris (использует Perl для кодировки base64):

# usage: email_attachment to cc subject body attachment_filename
email_attachment() {
    to="$1"
    cc="$2"
    subject="$3"
    body="$4"
    filename="${5:-''}"
    boundary="_====_blah_====_$(date +%Y%m%d%H%M%S)_====_"
    {
        print -- "To: $to"
        print -- "Cc: $cc"
        print -- "Subject: $subject"
        print -- "Content-Type: multipart/mixed; boundary=\"$boundary\""
        print -- "Mime-Version: 1.0"
        print -- ""
        print -- "This is a multi-part message in MIME format."
        print -- ""
        print -- "--$boundary"
        print -- "Content-Type: text/plain; charset=ISO-8859-1"
        print -- ""
        print -- "$body"
        print -- ""
        if [[ -n "$filename" && -f "$filename" && -r "$filename" ]]; then
            print -- "--$boundary"
            print -- "Content-Transfer-Encoding: base64"
            print -- "Content-Type: application/octet-stream; name=$filename"
            print -- "Content-Disposition: attachment; filename=$filename"
            print -- ""
            print -- "$(perl -MMIME::Base64 -e 'open F, shift; @lines=<F>; close F; print MIME::Base64::encode(join(q{}, @lines))' $filename)"
            print -- ""
        fi
        print -- "--${boundary}--"
    } | /usr/lib/sendmail -oi -t
}

Ответ 10

Отправьте электронное письмо тела Plaintext с одним вложением открытого текста с mailx:

(
  /usr/bin/uuencode attachfile.txt myattachedfilename.txt; 
  /usr/bin/echo "Body of text"
) | mailx -s 'Subject' [email protected]

Ниже приведена та же команда, что и выше, без строк новой строки

( /usr/bin/uuencode /home/el/attachfile.txt myattachedfilename.txt; /usr/bin/echo "Body of text" ) | mailx -s 'Subject' [email protected]

Убедитесь, что у вас есть файл /home/el/attachfile.txt, определенный с помощью этого содержимого:

<html><body>
Government discriminates against programmers with cruel/unusual 35 year prison
sentences for making the world information free, while bankers that pilfer 
trillions in citizens assets through systematic inflation get the nod and 
walk free among us.
</body></html>

Если у вас нет uuencode, прочитайте это: https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work

В Linux, отправьте письмо электронной почты HTML с вложением PDF с помощью sendmail:

Убедитесь, что у вас установлен ksh: yum info ksh

Убедитесь, что у вас установлен и настроен sendmail.

Убедитесь, что у вас установлен uuencode и доступен: https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work

Создайте новый файл с именем test.sh и поместите его в свой домашний каталог: /home/el

Поместите следующий код в test.sh:

#!/usr/bin/ksh
export MAILFROM="[email protected]"
export MAILTO="[email protected]"
export SUBJECT="Test PDF for Email"
export BODY="/home/el/email_body.htm"
export ATTACH="/home/el/pdf-test.pdf"
export MAILPART=`uuidgen` ## Generates Unique ID
export MAILPART_BODY=`uuidgen` ## Generates Unique ID

(
 echo "From: $MAILFROM"
 echo "To: $MAILTO"
 echo "Subject: $SUBJECT"
 echo "MIME-Version: 1.0"
 echo "Content-Type: multipart/mixed; boundary=\"$MAILPART\""
 echo ""
 echo "--$MAILPART"
 echo "Content-Type: multipart/alternative; boundary=\"$MAILPART_BODY\""
 echo ""
 echo "--$MAILPART_BODY"
 echo "Content-Type: text/plain; charset=ISO-8859-1"
 echo "You need to enable HTML option for email"
 echo "--$MAILPART_BODY"
 echo "Content-Type: text/html; charset=ISO-8859-1"
 echo "Content-Disposition: inline"
 cat $BODY
 echo "--$MAILPART_BODY--"

 echo "--$MAILPART"
 echo 'Content-Type: application/pdf; name="'$(basename $ATTACH)'"'
 echo "Content-Transfer-Encoding: uuencode"
 echo 'Content-Disposition: attachment; filename="'$(basename $ATTACH)'"'
 echo ""
 uuencode $ATTACH $(basename $ATTACH)
 echo "--$MAILPART--"
) | /usr/sbin/sendmail $MAILTO

Измените переменные экспорта в верхней части test.sh, чтобы отобразить ваш адрес и имена файлов.

Загрузите тестовый pdf-документ и поместите его в /home/el под названием pdf-test.pdf

Сделайте файл с именем /home/el/email _body.htm и поместите в него эту строку:

<html><body><b>this is some bold text</b></body></html>

Убедитесь, что файл pdf имеет достаточно 755 разрешений.

Запустите script ./test.sh

Проверьте свой почтовый ящик, текст должен быть в формате HTML, а файл pdf автоматически интерпретируется как двоичный файл. Будьте внимательны, чтобы не использовать эту функцию больше, чем 15 раз в день, даже если вы отправляете электронные письма самим себе, фильтры спама в gmail могут помечать черный список домена, spewing электронной почты, не давая вам возможность пропустить их. И вы обнаружите, что это больше не работает, или оно позволяет только через вложение, или письмо не приходит вообще. Если вам нужно провести много испытаний по этому поводу, разложите их в течение нескольких дней или вы будете помечены как спамер, и эта функция больше не будет работать.

Ответ 11

Здесь есть несколько ответов, предлагающих mail или mailx так что это скорее фон, чтобы помочь вам интерпретировать их в контексте.

Исторические заметки

Происхождение mail Unix восходит к туманам ранней истории Bell Labs Unix ™ (1969?), И мы, вероятно, не можем надеяться углубиться в ее полную генеалогию здесь. Достаточно сказать, что есть много программ, которые наследуют код или переопределяют (или наследуют код от переопределения) mail и что не существует единой базы кода, которая может быть однозначно идентифицирована как " mail.

Однако одним из претендентов на эту должность, безусловно, является "Почта Беркли", которая первоначально называлась Mail с заглавной буквой М в 2BSD (1978); но в 3BSD (1979) он также заменил команду mail в нижнем регистре, что привело к некоторой новой путанице. SVR3 (1986) включал производную, которая называлась mailx. x предположительно добавил, чтобы сделать его уникальным и различны; но теперь это тоже было скопировано, переопределено и искалечено, так что нет единой отдельной версии, которая была бы окончательной.

Раньше стандартом де-факто для отправки двоичных файлов по электронной почте был uuencode. Он все еще существует, но имеет множество проблем с юзабилити; если это вообще возможно, вы должны вместо этого отправлять вложения MIME, если только вы не стремитесь к тому, чтобы иметь возможность общаться с концом 1980-х годов.

MIME был представлен в начале 1990-х годов для решения ряда проблем с электронной почтой, включая поддержку различных типов контента, кроме простого текста, в одном наборе символов, который действительно подходит только для подмножества английского языка (и, как нам говорят, на гавайском языке)). Это привело к поддержке многокомпонентных сообщений, интернационализации, богатых типов контента и т.д. И быстро завоевало популярность в течение 1990-х годов.

( mailx истории Heirloom mail/mailx были наиболее полезны при составлении этого документа, и, безусловно, их стоит прочитать, если вы mailx вещи.)

Текущие предложения

Начиная с 2018 года, в Debian есть три пакета, которые включают команду mail или mailx. (Вы можете искать Provides: mailx.)

debian$ aptitude search ~Pmailx
i   bsd-mailx                       - simple mail user agent
p   heirloom-mailx                  - feature-rich BSD mail(1)
p   mailutils                       - GNU mailutils utilities for handling mail

(Я не выделяю Debian в качестве рекомендации; это то, что я использую, поэтому я с ним знаком; и он дает возможность однозначно различать различные альтернативы, ссылаясь на их соответствующие имена пакетов. Это, очевидно, также дистрибутив какая Ubuntu получает эти пакеты.)

В связи с этим, если вам нужен переносимый код и он может зависеть от довольно сложного пакета, простой способ переносить вложения MIME - использовать mutt.

Ответ 12

Другая альтернатива - Swaks (швейцарский армейский нож для SMTP).

swaks -tls \
    --to ${MAIL_TO} \
    --from ${MAIL_FROM} \
    --server ${MAIL_SERVER} \
    --auth LOGIN \
    --auth-user ${MAIL_USER} \
    --auth-password ${MAIL_PASSWORD} \
    --header "Subject: $MAIL_SUBJECT" \
    --header "Content-Type: text/html; charset=UTF-8" \
    --body "$MESSAGE" \
    --attach mysqldbbackup.sql

Ответ 13

Метамайл имеет метаданный инструмента

metasend -f mysqlbackup.sql.gz -t [email protected] -s Backup -m application/x-gzip -b

Ответ 14

Я использовал

echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "[email protected]" 

и это сработало хорошо для меня....

Ответ 15

mailx теперь имеет параметр -a для вложений.

Ответ 16

Обычно я использую только команду mail на RHEL. Я пробовал mailx, и он довольно эффективен.

mailx -s "Sending Files" -a First_LocalConfig.conf -a
Second_LocalConfig.conf [email protected]

This is the content of my msg.

.

Ответ 17

Самый короткий способ для меня -

file=filename_or_filepath;uuencode $file $file|mail -s "optional subject" email_address

поэтому для вашего примера это будет

file=your_sql.log;gzip -c $file;uuencode ${file}.gz ${file}|mail -s "file with magnets" [email protected]

Хорошая часть заключается в том, что я могу вспомнить ее с помощью Ctrl + r, чтобы отправить другой файл...

Ответ 18

Из исходной машины

mysqldump --defaults-extra-file=sql.cnf database | gzip | base64 | mail [email protected]

На машине назначения. Сохраните полученный почтовый ящик как db.sql.gz.b64; то..

base64 -D -i db.sql.gz.b64 | gzip -d | mysql --defaults-extra-file=sql.cnf

Ответ 19

с помощью команды mailx

 echo "Message Body Here" | mailx -s "Subject Here" -a file_name [email protected]

с помощью sendmail

#!/bin/ksh

fileToAttach=data.txt

`(echo "To: [email protected]"
  echo "Cc: [email protected]"
  echo "From: Application"
  echo "Subject: your subject"
  echo  your body
  uuencode $fileToAttach $fileToAttach
  )| eval /usr/sbin/sendmail -t `;

Ответ 20

Просто чтобы добавить мои 2 цента, я бы написал свой собственный PHP Script:

http://php.net/manual/en/function.mail.php

Существует множество способов сделать вложение в примерах на этой странице.

Ответ 21

Не метод отправки электронной почты, но для этого вы можете использовать онлайн-сервер Git (например, Bitbucket или аналогичную услугу).

Таким образом, вы можете использовать команды git push, и все версии будут храниться сжатым и организованным способом.

Ответ 22

Вот как я делаю с одним большим файлом журнала в CentOS:

MAIL="`whereis mail | awk '{print $2}'`"
WHOAMI="`whoami`"
HOSTNAME="`hostname`"
EMAIL"[email protected]"
LOGDIR="/var/log/aide"
LOGNAME="`basename "$0"`_`date "+%Y%m%d_%H%M"`"
# Arhiveerime ning kui hästi, saadame edasi:
/bin/tar -zcvf ${LOGDIR}/${LOGNAME}.tgz "${LOGDIR}/${LOGNAME}.log" > /dev/null 2>&1
if [ $? -eq 0 ]; then
    cd ${LOGDIR}
    # This works too. The message content will be taken from text file below
    # echo 'Hello!' >/root/scripts/audit_check.sh.txt
    # echo "Arhiivifail manuses" | ${MAIL} -s "${HOSTNAME} Aide report" -q /root/scripts/audit_check.sh.txt -a ${LOGNAME}.tgz -S from=${WHOAMI}@${HOSTNAME} ${EMAIL}
    echo "Arhiivifail manuses" | ${MAIL} -s "${HOSTNAME} Aide report" -a ${LOGNAME}.tgz -S from=${WHOAMI}@${HOSTNAME} ${EMAIL}
    /bin/rm "${LOGDIR}/${LOGNAME}.log"
fi

Ответ 23

Если файл является текстом, вы можете отправить его проще всего в теле:

sendmail [email protected] < message.txt

Ответ 24

Mailutils делает это кусок пирога

echo "Body" | mail.mailutils -M -s "My Subject" -A attachment.pdf [email protected]
  • -A file прикрепляет файл
  • -M включает MIME, так что вы можете иметь вложение и текстовое тело.

Если еще не установлен, запустите

sudo apt install mailutils

Ответ 25

В зависимости от параметров вашей команды mail (проверьте это с помощью man mail) и версии, которую вы можете сделать

echo yourBody|mail -s yoursubject -A/your/attachment/file [email protected]

Ответ 26

Еще одна вещь о mutt: по умолчанию он использует ваш адрес и имя в поле "От:". Если это не то, что вам нужно, вы можете создать альтернативный файл muttrc, содержащий строку вроде этого:   set from = "My mail daemon"

Используйте этот файл с параметром командной строки -F.

Ответ 27

Если mutt не работает или не установлен, попробуйте это -

*#!/bin/sh

FilePath=$1
FileName=$2
Message=$3
MailList=$4

cd $FilePath

Rec_count=$(wc -l < $FileName)
if [ $Rec_count -gt 0 ]
then
(echo "The attachment contains $Message" ; uuencode $FileName $FileName.csv ) | mailx -s "$Message" $MailList
fi*