Я создал сценарий, который запускается каждую ночь на моем сервере Linux, который использует mysqldump для резервного копирования каждой из моих баз данных MySQL в файлы .sql и упаковывает их вместе в виде сжатого файла .tar. Следующий шаг, который я хочу выполнить, - это отправить этот tar-файл по электронной почте на удаленный почтовый сервер для безопасного хранения. Мне удалось отправить необработанный скрипт в теле письма, отправив текстовый файл резервной копии в mailx следующим образом:
$ cat mysqldbbackup.sql | mailx [email protected]
cat повторяет текст файла резервной копии, который передается в программу mailx с адресом электронной почты получателя, переданным в качестве аргумента.
Хотя это выполняет то, что мне нужно, я думаю, что это могло бы быть на один шаг лучше, Есть ли способ, используя сценарии оболочки или иным образом, отправить сжатый файл .tar в исходящее сообщение электронной почты как вложение? Это было бы лучше, чем иметь дело с очень длинными сообщениями электронной почты, которые содержат данные заголовка и часто имеют проблемы с переносом слов и т. д.
Извините, я давно этим не занимаюсь. Я знаю, что это включало вызов mysqldump, а затем прикрепление вывода к электронной почте (с mutt). Возможно, у меня даже был шаг, который также сжимал вывод в zip / tar.gz ...
Чисто любопытно, зачем отправлять резервные копии по электронной почте против scp или rsync?





Если посмотреть на man mailx, программа mailx не имеет возможности прикрепить файл. Вы можете использовать другую программу, например mutt.
echo "This is the message body" | mutt -a file.to.attach -s "subject of message" [email protected]
Параметры командной строки для mutt могут отображаться с помощью mutt -h.
Спасибо! Это помогло, у меня возникли проблемы с тем, чтобы заставить дворнягу выполнять действие беззвучно.
См. Ответ ниже (stackoverflow.com/a/9524359/10608), потому что, по-видимому, синтаксис изменен для mutt, который теперь требует --.
Вы можете использовать дворняга для отправки электронного письма с вложением
mutt -s "Backup" -a mysqldbbackup.sql [email protected] < message.txt
По крайней мере, с Mutt 1.5.21 (доверенный Ubuntu) вам нужно поставить параметр -a после получателя: mutt -s "Backup" [email protected] -a mysqldbbackup.sql < message.txt или использовать параметр -- перед получателем, как показано в ответе rynop.
В зависимости от вашей версии Linux он может называться mail. Процитирую @David выше:
mail -s "Backup" -a mysqldbbackup.sql [email protected] < message.txt
или также:
cat message.txt | mail -s "Backup" -a mysqldbbackup.sql [email protected]
@ KarelBílek: А как насчет другого варианта?
Оба решения у меня не работают. Я получил электронное письмо с Outlook 2013, и письмо содержит только имя файла
@ nickel715: может быть, у mail в вашей системе есть псевдоним?
моя страница руководства гласит: -a, --append=HEADER: VALUE append given header to the message being sent
@exhuma и Натан, в какой системе вы используете эту программу mail и откуда она взялась? В Ubuntu «почтовая» программа - это почтовая программа GNU от mailutils, у которой нет опции -a для прикрепления файла. manpages.ubuntu.com/manpages/lucid/en/man1/mail.1.html
@nealmcb Mine также имеет возможность добавить заголовок с параметром -a. Также в Ubuntu с использованием mailutils.
Натан, похоже, твоя цитата Дэвида неверна - он использовал команду mutt, а не mail. Также, как указывали другие, теперь кажется, что Mutt требует аргумент -- перед адресом. И я вижу, что @exhuma и я на самом деле согласны с тем, что делает опция -a в mail - я на минуту запутался;)
вместо -a вы должны использовать -A: -a, --append=HEADER: VALUE append given header to the message being sent-A, --attach=FILE attach FILE
@Victor Perov Я почти уверен, что это неправильно, по крайней мере, в нынешних разновидностях тупицы ... -A
Или, в случае неудачи, mutt:
gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz | mail -s "MySQL DB" [email protected]
Это отправляет uuencoded часть в соответствии, а не как вложение. Однако многие почтовые клиенты распознают это и отображать часть с uuencoded как вложение.
Не используйте uuencode в наше время. MIME немного сложнее, но гораздо удобнее.
@DavidGiven: См., Например, (беглым взглядом) все остальные ответы на этот вопрос.
Никто из них не пользуется почтой!
Тогда, например, stackoverflow.com/questions/3317174/… и замените text/html любым типом MIME, подходящим для вашего вложения. (В этом конкретном примере я предполагаю, что application/gzip.)
metamail имеет инструмент metasend
metasend -f mysqlbackup.sql.gz -t [email protected] -s Backup -m application/x-gzip -b
Раньше он устанавливался почти везде, но почти не использовался. Поскольку он долгое время не поддерживался (и до сих пор остается AFAIK), он был удален из стандартного набора инструментов де-факто на многих платформах.
Пользуюсь mpack.
mpack -s subject file [email protected]
К сожалению, mpack не распознает '-' как псевдоним для stdin. Но следующая работа, которую можно легко обернуть в псевдоним (оболочки) или скрипт:
mpack -s subject /dev/stdin [email protected] < file
Это может работать в bash для stdin. У меня нет mpack, поэтому не пробовал: mpack -s subject /dev/stdin [email protected] <(stdout_generating_program)
Однажды я написал эту функцию для ksh в Solaris (использует Perl для кодировки base64):
# usage: email_attachment to cc subject body attachment_filename
email_attachment() {
to = ""
cc = ""
subject = ""
body = ""
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
}
В GNU / Linux для кодирования можно использовать команду base64 вместо perl.
Ни одна шавка у меня не работала. Он думал, что адрес электронной почты был частью атташе. Должен сделать:
echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- [email protected]
Я использую mutt 1.5.21 (2010-09-15), и он требует, чтобы параметр -a был после электронной почты получателя
У меня работал с использованием Mutt 1.5.24 (2015-08-30) на openSUSE Leap 42.1.
@fugitive означает «конец возможностей». Взгляните на unix.stackexchange.com/questions/11376/…
Есть ли способ проверить наличие исключений и повторить отправку?
Чтобы добавить свои 2 цента, я бы написал свой собственный PHP-скрипт:
http://php.net/manual/en/function.mail.php
Есть много способов сделать прикрепление в примерах на этой странице.
Не на каждом сервере может быть установлен PHP. Если вы действительно хотите пойти по пути «напишите свой собственный сценарий», тогда вам больше подойдут perl или python, поскольку они обычно доступны по умолчанию.
sh еще более распространен. Есть повторяющиеся вопросы с ответами с хорошими примерами; вот мой.
(
/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'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
Убедитесь, что у вас установлен 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 разрешений.
Запускаем скрипт ./test.sh
Проверьте свой почтовый ящик, текст должен быть в формате HTML, а файл pdf автоматически интерпретируется как двоичный файл. Не используйте эту функцию чаще, чем, скажем, 15 раз в день, даже если вы отправляете электронные письма самому себе, спам-фильтры в Gmail могут занести в черный список домен, извергающий электронные письма, не давая вам возможности пропустить их. И вы обнаружите, что это больше не работает, или оно пропускает только вложения, или электронное письмо вообще не приходит. Если вам нужно провести много тестов по этому поводу, распределите их по дням, иначе вас сочтут спамером, и эта функция больше не будет работать.
Для меня это сработало наоборот. (echo 'Email Body'; uuencode filename filename) | mailx -s 'Subject' [email protected]
uuencode - это нет, правильно вложение. Он просто встраивает компьютерно-читаемый фрагмент текста в середину другого текста. Раньше он работал нормально, когда не было лучшего механизма, но это было 20 с лишним лет назад.
Я использую SendEmail, который был создан для этого сценария. Он упакован для Ubuntu, поэтому я предполагаю, что он доступен
sendemail -f [email protected] -t [email protected] -m "Here are your files!" -a file1.jpg file2.zip
http://caspian.dotconf.net/menu/Software/SendEmail/
Я считаю, что в вашем примере это должно быть sendEmail вместо sendemail.
Да и нет - в источнике (caspian) используется заглавная буква E, хотя это необычная стратегия именования инструментов командной строки (в мире Unix), по крайней мере, пакет Ubuntu этого программного обеспечения предоставляет как sendemail, так и sendEmail в /usr/bin/.
В моем Xubuntu 14.04.3 не установлен SendEmail
«sudo apt install sendemail», чтобы установить sendemail, и добавить «-f [email protected]» в обязательное поле from, чтобы команда работала. sendemail -f [email protected] [email protected] -m "Here are your files!" -a file1.jpg file2.zip
Вероятно, лучший вариант в Ubuntu: нет беспорядка с различными пакетами mail / mailx / Mail, можно прикреплять файлы и можно указать собственный адрес отправителя (вместо уродливого по умолчанию [email protected])
mailx теперь имеет вариант -a для вложений.
Параметр "-a" предназначен для заголовков.
man mail [x], версия 12.5 от 9.10.10 (несколько лет назад) ясно говорит -a file Прикрепить данный файл к сообщению.
mailx do. I believe there are two implementations. On one -a is for attachments, on the other it is for headers.
Версия mailx в Ubuntu происходит от GNU, и там -a означает добавление заголовка. manpages.ubuntu.com/manpages/lucid/en/man1/mailx.1.html Какая система и какой mailx делает вложение?
В новой реализации «-a» для заголовков, а «-A» для вложений.
Это не старое против нового, это просто другое наследие.
Это не метод отправки электронной почты, но вы можете использовать для этого онлайн-сервер Git (например, Bitbucket или аналогичный сервис).
Таким образом, вы можете использовать команды git push, и все версии будут храниться в сжатом и организованном виде.
Обычно я использую только команду 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, чтобы отправить другой файл ...
Скобки не принесут вам много пользы, но для полной переносимости вы должны заключать переменные в двойные кавычки. См. Также stackoverflow.com/questions/10067266/…
echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log [email protected]
Это должен быть принятый ответ. Использует mailx по умолчанию и отлично работает. Mutt v1.5.21 отказывается отправлять вложения размером> 1 МБ при использовании cron.
Я искал что-то, что работает в EC2, и это сработало нормально.
mailx не стандартизирован должным образом. Любой ответ, который рекомендует это, должен указывать на это предостережение. Обычно используются как минимум три несовместимых варианта.
я использовал
echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "[email protected]"
и это сработало для меня ....
Вот как я поступаю с одним большим файлом журнала в CentOS:
#!/bin/sh
MAIL_CMD = "$(which mail)"
WHOAMI = "$(whoami)"
HOSTNAME = "$(hostname)"
EMAIL"[email protected]"
LOGDIR = "/var/log/aide"
LOGNAME = "$(basename "$0")_$(date "+%Y%m%d_%H%M")"
if cd ${LOGDIR}; then
/bin/tar -zcvf "${LOGDIR}/${LOGNAME}".tgz "${LOGDIR}/${LOGNAME}.log" > /dev/null 2>&1
if [ -n "${MAIL_CMD}" ]; then
# This works too. The message content will be taken from text file below
# echo 'Hello!' >/root/scripts/audit_check.sh.txt
# echo "Attachment" | ${MAIL_CMD} -s "${HOSTNAME} Aide report" -q /root/scripts/audit_check.sh.txt -a ${LOGNAME}.tgz -S from=${WHOAMI}@${HOSTNAME} ${EMAIL}
echo "Attachment" | ${MAIL_CMD} -s "${HOSTNAME} Aide report" -a "${LOGNAME}.tgz" -S from = "${WHOAMI}@${HOSTNAME}" "${EMAIL}"
/bin/rm "${LOGDIR}/${LOGNAME}.log"
fi
fi
Почему вы определяете WHOAMI и HOSTNAMEдважды?
Здесь есть несколько ошибок стиля кодирования оболочки. shellcheck.net укажет на некоторые, но не на все из них.
С исходной машины
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
Если файл является текстовым, его проще всего отправить в теле как:
sendmail [email protected] < message.txt
Это не отправляет его как вложение или даже как тело сообщения. Sendmail ожидает, что его ввод будет полным, правильно оформленным сообщением электронной почты RFC5322, и в противном случае может привести к интересным сбоям.
Если Mutt не работает или не установлен, попробуйте следующее:
*#!/bin/sh
FilePath=
FileName=
Message=
MailList=
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*
Еще одна альтернатива - Сваки (Швейцарский армейский нож для 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
используя команду 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 `;
sendmail - хороший пример, рад, что нашел его здесь.
Обратите внимание, что вам нужна пустая строка в начале «вашего тела», иначе тело исчезнет в заголовках или, возможно, полностью разорвет сообщение. Также см. Примечания в другом месте об отказе от uuencode в пользу MIME.
И чудовищный eval и загадочная обратная связь вокруг всей хитрости здесь совершенно не нужны.
Здесь есть несколько ответов, предлагающих mail или mailx, так что это скорее фон, который поможет вам интерпретировать их в контексте.
Истоки Unix mail уходят в глубь веков ранней истории Bell Labs Unix ™ (1969?), И мы, вероятно, не можем надеяться углубиться в его полную генеалогию здесь. Достаточно сказать, что существует множество программ, которые наследуют код или реализуют (или наследуют код от переопределения) mail, и что не существует единой кодовой базы, которую можно однозначно идентифицировать как «mail».
Однако одним из претендентов на эту позицию, безусловно, является "Berkeley Mail", которая первоначально называлась Mail с заглавной буквой M в 2BSD (1978); но в 3BSD (1979) он также заменил команду mail в нижнем регистре, что привело к некоторой новой путанице. SVR3 (1986) включал производное, получившее название mailx. Предположительно, x был добавлен, чтобы сделать его уникальным и неповторимым; но это тоже теперь было скопировано, переопределено и искажено, так что не существует единой индивидуальной версии, которая была бы окончательной.
Раньше стандартом де-факто для отправки двоичных файлов по электронной почте был uuencode. Он все еще существует, но имеет множество проблем с удобством использования; если это вообще возможно, вам следует вместо этого отправлять вложения MIME, если вы специально не стремитесь иметь возможность общаться с концом 1980-х годов.
MIME был введен в начале 1990-х годов для решения нескольких проблем с электронной почтой, включая поддержку различных типов контента, кроме простого текста, в единственном наборе символов, который действительно подходит только для подмножества английского (и, как нам говорят, гавайского) ). Это ввело поддержку многостраничных сообщений, интернационализации, разнообразных типов контента и т. д. И быстро завоевало популярность на протяжении 1990-х годов.
(Исторические заметки семейной реликвии mail / 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, также известный как GNU Mailutils, включает в себя Обертка совместимости mail / mailx, который делает поддерживает отправку вложений MIME с -AС учетом этих проблем, если вам нужно, чтобы ваш код был переносимым и может зависеть от довольно сложного пакета, простой способ переносимой отправки вложений MIME - это используйте mutt.
Изначально я разместил это как ответ на умеренно популярный повторяющийся вопрос stackoverflow.com/questions/902591/…
Mailutils делает это проще простого
echo "Body" | mail.mailutils -M -s "My Subject" -A attachment.pdf [email protected]
-A file прикрепляет файл-M включает MIME, так что вы можете иметь вложение и тело в виде открытого текста.Если еще не установлен, запустите
sudo apt install mailutils
В зависимости от параметров вашей почтовой команды (проверьте это с помощью man mail) и версии, которую вы могли бы сделать
echo yourBody|mail -s yoursubject -A /your/attachment/file [email protected]
Похоже, что это дублирует существующие ответы без добавления чего-либо нового, в первую очередь опция -A специфична для версии mailutils GNU mail, как было указано в моем ответе, а также в @rumpel
Можете ли вы поделиться сценарием резервного копирования ваших баз данных MySQL?