Как отправить файл в виде вложения электронной почты с помощью командной строки Linux? - PullRequest
277 голосов
/ 20 августа 2008

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

$ cat mysqldbbackup.sql | mailx backup@email.com

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

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

Ответы [ 26 ]

287 голосов
/ 02 марта 2012

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

echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com
78 голосов
/ 20 августа 2008

Или, в случае неудачи, дурак:

gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz  | mail -s "MySQL DB" backup@email.com
41 голосов
/ 20 августа 2008

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

echo "This is the message body" | mutt -a file.to.attach -s "subject of message" recipient@domain.com

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

40 голосов
/ 20 августа 2008

В зависимости от вашей версии Linux он может называться mail. Процитировать @David выше:

mail -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt

или также:

cat message.txt | mail -s "Backup" -a mysqldbbackup.sql backup@email.com 
28 голосов
/ 24 сентября 2009

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

mpack -s subject file user@example.com

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

mpack -s subject /dev/stdin loser@example.com < file
27 голосов
/ 31 октября 2013

Я использую SendEmail, который был создан для этого сценария. Он упакован для Ubuntu, поэтому я предполагаю, что он доступен

sendemail -f sender@some.where -t receiver@some.place -m "Here are your files!" -a file1.jpg file2.zip

http://caspian.dotconf.net/menu/Software/SendEmail/

22 голосов
/ 22 мая 2015
 echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log email_id@example.com
12 голосов
/ 20 августа 2008

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

mutt -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt
11 голосов
/ 03 февраля 2011

Я однажды написал эту функцию для 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
}
9 голосов
/ 08 января 2013

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

(
  /usr/bin/uuencode attachfile.txt myattachedfilename.txt; 
  /usr/bin/echo "Body of text"
) | mailx -s 'Subject' youremail@gmail.com

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

( /usr/bin/uuencode /home/el/attachfile.txt myattachedfilename.txt; /usr/bin/echo "Body of text" ) | mailx -s 'Subject' youremail@gmail.com

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

<html><body>
Government discriminates against programmers with cruel/unusual 35 year prison
sentences for making the world's 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="el@defiant.com"
export MAILTO="youremail@gmail.com"
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.

Запустить скрипт ./test.sh

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...