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

StackOverflow https://stackoverflow.com/questions/17359

  •  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

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

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

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 получает эти пакеты.)

Учитывая эти проблемы, если вам нужно, чтобы ваш код был переносимым и мог зависеть от несколько сложного пакета, простой способ переносимой отправки 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*
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top