Linux

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

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

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

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

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

 

Ответ 1

Однажды я написал эту функцию для 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 ; 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

}

 

Ответ 2

Отправьте письмо с обычным текстом и одним вложением с открытым текстом с помощью 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>

Некоторый текст вложения в файле. Используется, как пример, реализующий тестовый вариант. Необходим для успешного выполнения команды, указанной выше.

</body></html>

В Linux отправка HTML-тела письма с PDF-вложением с помощью sendmail:

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

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

  3. Убедитесь, что у вас установлен и доступен uuencode.

  4. Создайте новый файл 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` ## генерация Unique ID

export MAILPART_BODY=`uuidgen` ## генерация 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 "Вам необходимо включить опцию HTML для электронной почты "

 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>это жирный текст</b></body></html>.

Убедитесь, что файл pdf имеет достаточные права доступа 755.

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

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

 


Ответ 3

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

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

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

По состоянию на 2018 год, в Debian есть три пакета, которые включают команду mail или mailx. 

debian$ aptitude search ~Pmailx

i bsd-mailx простой почтовый пользовательский агент

p heirloom-mailx многофункциональный BSD mail(1)

p mailutils утилиты GNU mailutils для работы с почтой

bsd-mailx это относительно простой mailx, который, похоже, не поддерживает отправку MIME-вложений. Посмотрите его руководство и обратите внимание, что именно его вы ожидаете найти в системе *BSD, включая MacOS, по умолчанию.

heirloom-mailx теперь называется s-nail и поддерживает отправку MIME-вложений с параметром -a. См. страницу с руководством по его использованию и в целом проект Heirloom.

mailutils aka GNU Mailutils включает обертку для совместимости с mail/mailx, которая поддерживает отправку MIME-вложений с параметром -A.

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

 

Схожие статьи

Linux

Как предотвратить остановку фонового процесса после закрытия клиента SSH в Linux

Linux

Как работают макросы likely/unlikely в ядре Linux и в чем их преимущество

Linux

Взломан сервер – что делать?

Linux

Как быстро скопировать большое количество файлов между двумя серверами