Сведения о вопросе

LARVION

12:14, 18th August, 2020

Теги

linux   email   command-line    

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

Просмотров: 803   Ответов: 21

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

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

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

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



  Сведения об ответе

piter

03:15, 13th August, 2020

Ни одна из этих дворняг не работала на меня. Он думал, что адрес email был частью атташе-НТА. Должен был сделать:

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


  Сведения об ответе

ЯЯ__4

20:27, 22nd August, 2020

Или провалившаяся дворняга:

gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz  | mail -s "MySQL DB" backup@email.com


  Сведения об ответе

appple

21:30, 4th August, 2020

Глядя на 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 .


  Сведения об ответе

LAST

09:54, 14th August, 2020

В зависимости от вашей версии 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 


  Сведения об ответе

crush

01:29, 2nd August, 2020

Я использую mpack.

mpack -s subject file user@example.com

К сожалению, mpack не распознает '-' как псевдоним для stdin. Но следующая работа, и ее можно легко завернуть в (shell) псевдоним или скрипт:

mpack -s subject /dev/stdin loser@example.com < file


  Сведения об ответе

#hash

03:23, 18th August, 2020

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


  Сведения об ответе

ASER

18:29, 11th August, 2020

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


  Сведения об ответе

SSESION

01:51, 29th August, 2020

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

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


  Сведения об ответе

SSESION

15:51, 15th August, 2020

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


  Сведения об ответе

#hash

16:45, 16th August, 2020

Отправить текстовое тело email с одним открытым вложением с помощью 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 body email с вложением 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

Проверьте ваш почтовый ящик email, текст должен быть в формате HTML, а файл pdf автоматически интерпретируется как двоичный файл. Будьте осторожны, чтобы не использовать эту функцию больше, чем скажем 15 раз в день, даже если вы отправляете письма себе, спам-фильтры в gmail могут внести домен в черный список, извергающий письма, не давая вам возможности пропустить их. И вы обнаружите, что это больше не работает,или он только пропускает вложение, или email вообще не проходит. Если вам нужно сделать много тестов на этом, распространите их в течение нескольких дней, или вы будете помечены как спамер, и эта функция больше не будет работать.


  Сведения об ответе

VCe znayu

20:00, 25th August, 2020

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

историческая справка

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

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

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

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

( Исторические заметки Heirloom 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 . Смотрите его справочную страницу и более общий проект Heirloom
  • mailutils aka GNU Mailutils включает в себя оболочку совместимости mail / mailx , которая поддерживает отправку вложений MIME с -A

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


  Сведения об ответе

COOL

04:45, 27th August, 2020

Еще одна альтернатива- Swaks (Swiss Army Knife for 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


  Сведения об ответе

SKY

22:05, 3rd August, 2020

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

metasend -f mysqlbackup.sql.gz -t backup@email.com -s Backup -m application/x-gzip -b


  Сведения об ответе

davran

00:22, 14th August, 2020

Я использовал

echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "a@b.c" 

и это хорошо сработало для меня....


  Сведения об ответе

piter

18:10, 11th August, 2020

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


  Сведения об ответе

SEEYOU

19:36, 18th August, 2020

Обычно я использую только команду 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.

.


  Сведения об ответе

FAriza

19:26, 2nd August, 2020

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

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


  Сведения об ответе

piter

13:05, 2nd August, 2020

От исходной машины

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


  Сведения об ответе

LAST

02:09, 18th August, 2020

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


  Сведения об ответе

qwerty101

09:11, 17th August, 2020

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

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

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


  Сведения об ответе

appple

09:23, 18th August, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться