Ответ 1
Никто из меня не работал. Он думал, что адрес электронной почты был частью attachemnt. Пришлось делать:
echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- [email protected]
Я создал script, который работает каждую ночь на моем Linux-сервере, который использует mysqldump
для резервного копирования каждой из моих баз данных MySQL в файлы .sql и упаковывает их вместе как сжатый .tar файл. Следующий шаг, который я хочу выполнить, - отправить этот файл tar через электронную почту на удаленный почтовый сервер для сохранения. Я смог отправить raw script в теле письмо, отправив резервный текстовый файл на mailx
следующим образом:
$ cat mysqldbbackup.sql | mailx [email protected]
cat
отображает текст файла резервной копии, который отправляется в программу mailx
с адресом электронной почты получателя, переданным в качестве аргумента.
В то время как это выполняет то, что мне нужно, я думаю, что это может быть на один шаг лучше, Есть ли способ, используя сценарии оболочки или иначе, отправить сжатый .tar файл в исходящее сообщение электронной почты в виде вложения? Это может привести к тому, что вам придется иметь дело с очень длинными сообщениями электронной почты, которые содержат данные заголовка и часто имеют проблемы с переносом слов и т.д.
Никто из меня не работал. Он думал, что адрес электронной почты был частью attachemnt. Пришлось делать:
echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- [email protected]
Или, сбой в mutt:
gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz | mail -s "MySQL DB" [email protected]
От взгляда на man mailx
программа mailx не имеет опции для прикрепления файла. Вы можете использовать другую программу, такую как mutt.
echo "This is the message body" | mutt -a file.to.attach -s "subject of message" [email protected]
Параметры командной строки для mutt могут быть показаны с помощью mutt -h
.
В зависимости от вашей версии Linux это можно назвать почтой. Чтобы процитировать @David выше:
mail -s "Backup" -a mysqldbbackup.sql [email protected] < message.txt
а также:
cat message.txt | mail -s "Backup" -a mysqldbbackup.sql [email protected]
Я использую mpack.
mpack -s subject file [email protected]
К сожалению, mpack не распознает '-' как псевдоним для stdin. Но следующая работа и может быть легко обернута в псевдоним (оболочка) или script:
mpack -s subject /dev/stdin [email protected] < file
Я использую SendEmail, который был создан для этого сценария. Он упакован для Ubuntu, поэтому я предполагаю, что он доступен
sendemail -f [email protected] -t [email protected] -m "Here are your files!" -a file1.jpg file2.zip
echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log [email protected]
Вы можете использовать mutt для отправки электронной почты с вложением
mutt -s "Backup" -a mysqldbbackup.sql [email protected] < message.txt
Я однажды написал эту функцию для 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
}
(
/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
Убедитесь, что у вас установлен 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 электронной почты, не давая вам возможность пропустить их. И вы обнаружите, что это больше не работает, или оно позволяет только через вложение, или письмо не приходит вообще. Если вам нужно провести много испытаний по этому поводу, разложите их в течение нескольких дней или вы будете помечены как спамер, и эта функция больше не будет работать.
Здесь есть несколько ответов, предлагающих 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 получает эти пакеты.)
bsd-mailx
- это относительно простой mailx
который не поддерживает отправку MIME-вложений. См. Его страницу руководства и обратите внимание, что это то, что вы ожидаете найти в системе * BSD, включая MacOS, по умолчанию.heirloom-mailx
теперь называется s-nail
и поддерживает отправку вложений MIME с -a
. См. Его страницу руководства и в более общем плане проект семейной реликвииmailutils
aka GNU Mailutils включает mailx
совместимости mail
/mailx
которая поддерживает отправку MIME-вложений с -a
В связи с этим, если вам нужен переносимый код и он может зависеть от довольно сложного пакета, простой способ переносить вложения MIME - использовать mutt
.
Другая альтернатива - 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
Метамайл имеет метаданный инструмента
metasend -f mysqlbackup.sql.gz -t [email protected] -s Backup -m application/x-gzip -b
Я использовал
echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "[email protected]"
и это сработало хорошо для меня....
mailx
теперь имеет параметр -a
для вложений.
Обычно я использую только команду mail на RHEL. Я пробовал mailx, и он довольно эффективен.
mailx -s "Sending Files" -a First_LocalConfig.conf -a
Second_LocalConfig.conf [email protected]
This is the content of my msg.
.
Самый короткий способ для меня -
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, чтобы отправить другой файл...
Из исходной машины
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
с помощью команды 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 `;
Просто чтобы добавить мои 2 цента, я бы написал свой собственный PHP Script:
http://php.net/manual/en/function.mail.php
Существует множество способов сделать вложение в примерах на этой странице.
Не метод отправки электронной почты, но для этого вы можете использовать онлайн-сервер Git (например, Bitbucket или аналогичную услугу).
Таким образом, вы можете использовать команды git push
, и все версии будут храниться сжатым и организованным способом.
Вот как я делаю с одним большим файлом журнала в 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
Если файл является текстом, вы можете отправить его проще всего в теле:
sendmail [email protected] < message.txt
Mailutils делает это кусок пирога
echo "Body" | mail.mailutils -M -s "My Subject" -A attachment.pdf [email protected]
-A file
прикрепляет файл-M
включает MIME, так что вы можете иметь вложение и текстовое тело.Если еще не установлен, запустите
sudo apt install mailutils
В зависимости от параметров вашей команды mail (проверьте это с помощью man mail
) и версии, которую вы можете сделать
echo yourBody|mail -s yoursubject -A/your/attachment/file [email protected]
Еще одна вещь о mutt
: по умолчанию он использует ваш адрес и имя в поле "От:".
Если это не то, что вам нужно, вы можете создать альтернативный файл muttrc, содержащий строку вроде этого: set from = "My mail daemon"
Используйте этот файл с параметром командной строки -F
.
Если 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*