Как мне отправить файл в виде вложения электронной почты с помощью командной строки Linux?
-
08-06-2019 - |
Вопрос
Я создал скрипт, который запускается каждую ночь на моем Linux-сервере и использует mysqldump
создать резервную копию каждой из моих баз данных MySQL в файлах .sql и упаковать их вместе в виде сжатого файла .tar.Следующий шаг, который я хочу выполнить, - отправить этот tar-файл по электронной почте на удаленный почтовый сервер для сохранности.Я смог отправить необработанный скрипт в теле электронного письма, передав резервный текстовый файл по адресу mailx
вот так:
$ cat mysqldbbackup.sql | mailx backup@email.com
cat
повторяет текст файла резервной копии, который передается по каналу в mailx
программа, в качестве аргумента которой передается адрес электронной почты получателя.
Хотя это дает то, что мне нужно, я думаю, что это могло бы быть на шаг лучше, Есть ли какой-либо способ, используя сценарии командной строки или иным образом, отправить сжатый файл .tar в исходящее сообщение электронной почты в качестве привязанность? Это позволило бы избежать необходимости иметь дело с очень длинными сообщениями электронной почты, которые содержат данные заголовка и часто имеют проблемы с переносом слов и т.д.
Решение
Ни один из этих шавок у меня не сработал.Он думал, что адрес электронной почты был частью приложения.Пришлось сделать:
echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com
Другие советы
Или, неудачливый остолоп:
gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz | mail -s "MySQL DB" backup@email.com
От взгляда на 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
.
В зависимости от вашей версии 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
Я использую mpack.
mpack -s subject file user@example.com
К сожалению, mpack не распознает '-' в качестве псевдонима для stdin.Но следующее работает и может быть легко обернуто псевдонимом (shell) или скриптом:
mpack -s subject /dev/stdin loser@example.com < file
Я использую SendEmail, который был создан для этого сценария.Он упакован для Ubuntu, поэтому я предполагаю, что он доступен
sendemail -f sender@some.where -t receiver@some.place -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_id@example.com
Вы можете использовать дворняжка чтобы отправить электронное письмо с вложением
mutt -s "Backup" -a mysqldbbackup.sql backup@email.com < 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
}
Отправьте текстовое электронное письмо с одним вложением в виде открытого текста с помощью 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 могут занести домен, извергающий электронные письма, в черный список, не дав вам возможности пропустить их.И вы обнаружите, что это больше не работает, или пропускает только вложение, или электронное письмо вообще не приходит.Если вам нужно провести много тестов по этому поводу, распределите их на несколько дней, иначе вас назовут спамером, и эта функция больше не будет работать.
Здесь есть несколько ответов , предполагающих mail
или mailx
так что это скорее справочная информация, которая поможет вам интерпретировать их в контексте.
Исторические заметки
Истоки Unix mail
вернитесь в туман ранней истории Bell Labs Unix ™ (1969?), и мы, вероятно, не сможем надеяться углубиться здесь в его полную генеалогию.Достаточно сказать, что существует множество программ, которые наследуют код от или переопределяют (или наследуют код от переопределения) mail
и что не существует единой кодовой базы, которую можно было бы однозначно идентифицировать как "the". mail
.
Однако одним из претендентов на эту должность, безусловно, является "Berkeley Mail", которая первоначально называлась Mail
с заглавной буквой M в 2BSD (1978);но в 3BSD (1979) он заменил строчную букву mail
командование тоже, что приводит к некоторой новой путанице.SVR3 (1986) включал производную, которая называлась mailx
.Тот Самый x
предположительно, был добавлен для того, чтобы сделать его уникальным и отличительным;но это тоже теперь было скопировано, переосмыслено и искажено так, что не существует единой индивидуальной версии, которая была бы окончательной.
В те далекие времена, когда de facto стандартом для отправки двоичных файлов по электронной почте было uuencode
.Он все еще существует, но имеет множество проблем с удобством использования;если это вообще возможно, вам следует отправлять вложения MIME вместо этого, если только вы специально не стремитесь иметь возможность общаться с концом 1980-х.
ПАНТОМИМА был представлен в начале 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
.
Еще одна альтернатива - Качается (Швейцарский армейский нож для 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
у metamail есть инструмент metasend
metasend -f mysqlbackup.sql.gz -t backup@email.com -s Backup -m application/x-gzip -b
Я использовал
echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "a@b.c"
и у меня это хорошо сработало....
mailx
действительно имеет -a
теперь доступна опция для вложений.
Обычно я использую только команду mail в RHEL.Я пробовал mailx, и он довольно эффективен.
mailx -s "Sending Files" -a First_LocalConfig.conf -a
Second_LocalConfig.conf Recipient@myemail.com
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" ph.gachoud@gmail.com
хорошая часть заключается в том, что я могу вспомнить это с Ctrl+r чтобы отправить другой файл...
С исходного компьютера
mysqldump --defaults-extra-file=sql.cnf database | gzip | base64 | mail me@myemail.com
На целевом компьютере.Сохраните текст полученного письма как 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 user@example.com
использование sendmail
#!/bin/ksh
fileToAttach=data.txt
`(echo "To: user@company.com"
echo "Cc: user@company.com"
echo "From: Application"
echo "Subject: your subject"
echo your body
uuencode $fileToAttach $fileToAttach
)| eval /usr/sbin/sendmail -t `;
Просто чтобы добавить свои 2 цента, я бы написал свой собственный PHP-скрипт:
http://php.net/manual/en/function.mail.php
Есть много способов сделать вложение в примерах на этой странице.
Это не метод отправки электронной почты, но вы можете использовать онлайн-сервер Git (напримерBitbucket или аналогичный сервис) для этого.
Таким образом, вы можете использовать git push
команды и все версии будут храниться в сжатом и организованном виде.
Вот как я поступаю с одним большим файлом журнала в CentOS:
MAIL="`whereis mail | awk '{print $2}'`"
WHOAMI="`whoami`"
HOSTNAME="`hostname`"
EMAIL"your@email.address"
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 recipient@example.com < message.txt
Mailutils делает это проще простого
echo "Body" | mail.mailutils -M -s "My Subject" -A attachment.pdf mail@example.org
-A file
прикрепляет файл-M
включает MIME, чтобы у вас могло быть вложение и текстовое тело в открытом виде.
Если еще не установлен, запустите
sudo apt install mailutils
Еще одна вещь о mutt
:по умолчанию он использует ваш адрес и имя в поле "От:".Если это не то, что вам нужно, вы можете создать альтернативный файл muttrc, содержащий строку, подобную этой:set from="Мой почтовый демон"
Используйте этот файл с -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*