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

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

$ cat mysqldbbackup.sql | mailx [email protected]

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

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

Ответов (25)

Решение

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

echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- [email protected]

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

mpack -s subject /dev/stdin [email protected] < file

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

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

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

Я использую 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/

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

.

Отправьте основное электронное письмо с открытым текстом с одним вложением с открытым текстом с помощью mailx:

(
  /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

В 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="[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 "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]ess"
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

mailx теперь есть -a возможность для вложений.

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

самый короткий путь для меня это

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, чтобы отправить другой файл ...

Mailutils делает это проще простого

echo "Body" | mail.mailutils -M -s "My Subject" -A attachment.pdf [email protected]
  • -A file прикрепляет файл
  • -M включает MIME, так что вы можете иметь вложение и тело в виде открытого текста.

Если еще не установлен, запустите

sudo apt install mailutils

С исходной машины

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

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

Еще одна альтернатива - 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

Здесь есть несколько ответов, предполагающих mail или mailx так, что это скорее фон, который поможет вам интерпретировать их в контексте.

Исторические заметки

Истоки Unix mailуходят в глубь веков ранней истории Bell Labs Unix ™ (1969?), И мы, вероятно, не можем надеяться углубиться в ее полную генеалогию здесь. Достаточно сказать, что существует множество программ, которые наследуют код от или переопределения (или наследуют код от переопределения), mail и что не существует единой кодовой базы, которую можно было бы однозначно идентифицировать как «the» mail .

Тем не менее, одним из претендентов на эту позицию, безусловно, является «Berkeley Mail», которая Mail в 2BSD (1978) изначально называлась с заглавной буквой M; но в 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 получает эти пакеты.)

С этими проблемами, если вам нужен код , чтобы быть портативным и может зависеть от степени сложного пакета, простой способ переносимым отправлять вложения MIME является использование mutt.

Вы можете использовать mutt для отправки электронного письма с вложением

mutt -s "Backup" -a mysqldbbackup.sql [email protected] < message.txt

Глядя на man mailx, программа mailx не имеет опции для прикрепления файла. Вы можете использовать другую программу, например mutt.

echo "This is the message body" | mutt -a file.to.attach -s "subject of message" [email protected]

Параметры командной строки для mutt можно отобразить с помощью mutt -h .

Или, в случае неудачи, mutt:

gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz  | mail -s "MySQL DB" [email protected]

metamail имеет инструмент metasend

metasend -f mysqlbackup.sql.gz -t [email protected] -s Backup -m application/x-gzip -b

Однажды я написал эту функцию для 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
}
 echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log [email protected]