Я создал сценарий, который запускается каждую ночь на моем 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:
Убедитесь, что у вас установлен ksh: yum info ksh.
Убедитесь, что у вас установлен и настроен sendmail.
Убедитесь, что у вас установлен и доступен uuencode.
Создайте новый файл 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