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

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

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

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

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

25 ответов


ни один из дворняг не работал на меня. Он думал, что адрес электронной почты был частью attachemnt. Пришлось сделать:

echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com

или, провалив mutt:

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. Но следующая работа, и может быть легко обернута в псевдоним (оболочку) или скрипт:

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

http://caspian.dotconf.net/menu/Software/SendEmail/


 echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log email_id@example.com

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

можно использовать Матт отправить письмо с вложением

mutt -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt

отправить текстовое тело электронной почты с одним вложением открытого текста с 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

на Линуксе, отправьте электронную почту тела 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-тест.формат 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?), и мы, вероятно, не можем надеяться здесь углубиться в его полную генеалогию. Достаточно сказать, что существует множество программ, которые наследуют код или переопределить (или наследовать код reimplementation of)mail и что нет единой базы кода, которую можно однозначно идентифицировать как "The"mail.

однако одним из претендентов на эту должность, безусловно, является "Berkeley Mail", которая первоначально называлась Mail в верхнем регистре M в 2BSD (1978); но в 3BSD (1979) он заменил нижний регистр как хорошо, что приводит к некоторой путанице. SVR3 (1986) включал производную, которая называлась mailx. The x предположительно, добавлен сделайте ее уникальной и отчетливой; но и она теперь скопирована, переработана и изуродована, так что нет ни одной окончательной версии.

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

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

(The негибридные mail/mailx заметки по истории были наиболее полезны при составлении этого, и, безусловно, стоит прочитать, если вы в такого рода вещи.)

Текущие Предложения

по состоянию на 2018 год Debian имеет три пакета, которые включают mail или . (Вы можете искать 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.


другая альтернатива - 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

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.ГЗ.b64; затем..

base64 -D -i db.sql.gz.b64 | gzip -d | mysql --defaults-extra-file=sql.cnf

просто чтобы добавить мои 2 цента, я бы написал свой собственный PHP-скрипт:

http://php.net/manual/en/function.mail.php

есть много способов сделать вложение в примерах на этой странице.


Не метод отправки электронной почты, но вы можете использовать онлайн-сервер Git (например, Bitbucket или аналогичную службу) для этого.

таким образом, вы можете использовать git push команды, и все версии будут храниться в сжатом и структурированном виде.


вот как я делаю с одним большим файлом журнала в CentOS:

MAIL="`whereis mail | awk '{print }'`"
WHOAMI="`whoami`"
HOSTNAME="`hostname`"
EMAIL"your@email.address"
LOGDIR="/var/log/aide"
LOGNAME="`basename ""`_`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

использование команды 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 `;

еще одна вещь, о mutt: по умолчанию он использует ваш адрес и имя в поле "From:". Если это не то, что вам нужно, вы можете создать альтернативный файл muttrc, содержащий такую строку: установить из= "мой почтовый демон"

использовать этот файл с командная строка.


Если 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*