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

linux email command-line

632235 просмотра

26 ответа

3052 Репутация автора

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

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

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

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

Автор: Kit Roed Источник Размещён: 20.08.2008 02:48

Ответы (26)


41 плюса

582 Репутация автора

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

Автор: Chris N Размещён: 20.08.2008 03:05

12 плюса

3985 Репутация автора

Вы можете использовать Mutt, чтобы отправить письмо с приложением

mutt -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt
Автор: David Schlosnagle Размещён: 20.08.2008 03:09

41 плюса

65505 Репутация автора

В зависимости от вашей версии 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 
Автор: Nathan Fellman Размещён: 20.08.2008 03:36

79 плюса

1970 Репутация автора

Или провалившийся дурак:

gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz  | mail -s "MySQL DB" backup@email.com
Автор: Daniel Fone Размещён: 20.08.2008 04:48

2 плюса

431 Репутация автора

у метапочты есть инструмент мета отправка

metasend -f mysqlbackup.sql.gz -t backup@email.com -s Backup -m application/x-gzip -b
Автор: Gunstick Размещён: 17.09.2008 03:18

28 плюса

0 Репутация автора

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

mpack -s subject file user@example.com

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

mpack -s subject /dev/stdin loser@example.com < file
Автор: Torkel Bjørnson Размещён: 24.09.2009 07:00

12 плюса

178410 Репутация автора

Однажды я написал эту функцию для 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
}
Автор: glenn jackman Размещён: 03.02.2011 02:48

291 плюса

24885 Репутация автора

Решение

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

echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com
Автор: rynop Размещён: 01.03.2012 09:26

0 плюса

3626 Репутация автора

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

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

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

Автор: Mike Graf Размещён: 24.09.2012 06:34

9 плюса

167 Репутация автора

Отправьте текстовое электронное письмо с одним вложенным текстом в формате 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 могут занести в черный список домен, извергающий электронные письма, не давая вам возможности пропустить их. И вы обнаружите, что это больше не работает, или только пропускает вложение, либо электронное письмо не приходит вообще. Если вам нужно много тестировать по этому поводу, распределите их по дням, или вы будете помечены как спамер, и эта функция больше не будет работать.

Автор: user1651561 Размещён: 08.01.2013 11:25

27 плюса

657 Репутация автора

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

Автор: Fredrik Wendt Размещён: 31.10.2013 11:54

1 плюс

96 Репутация автора

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

Автор: Allan Pinto Размещён: 28.12.2013 06:36

0 плюса

3836 Репутация автора

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

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

Автор: Ben-Uri Размещён: 29.06.2014 07:05

1 плюс

11 Репутация автора

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

.
Автор: Alejandro Santillan Размещён: 12.08.2014 02:23

1 плюс

1950 Репутация автора

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

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

Автор: Pipo Размещён: 14.04.2015 10:37

22 плюса

881 Репутация автора

 echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log email_id@example.com
Автор: Sourabh Potnis Размещён: 22.05.2015 09:29

2 плюса

21 Репутация автора

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

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

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

Автор: poncho Размещён: 04.08.2015 03:17

0 плюса

1 Репутация автора

Вот как я делаю с одним большим файлом журнала в 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
Автор: dagorv Размещён: 04.09.2015 01:31

1 плюс

612 Репутация автора

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

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
Автор: Konchog Размещён: 22.01.2017 01:23

0 плюса

621 Репутация автора

Если файл текстовый, вы можете отправить его проще всего в теле как:

sendmail recipient@example.com < message.txt
Автор: nurp Размещён: 23.02.2017 11:33

-1 плюса

56 Репутация автора

Если 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*
Автор: Paras Singh Размещён: 16.05.2017 09:47

4 плюса

9573 Репутация автора

Другая альтернатива - 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
Автор: Alexander Yancharuk Размещён: 05.09.2017 09:57

0 плюса

2452 Репутация автора

используя команду 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 `;
Автор: Girdhar Singh Rathore Размещён: 08.09.2017 10:20

8 плюса

103282 Репутация автора

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

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

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

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

Автор: tripleee Размещён: 02.02.2018 05:35

0 плюса

5436 Репутация автора

Mailutils делает это кусок пирога

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

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

sudo apt install mailutils
Автор: rumpel Размещён: 16.02.2019 06:50

0 плюса

1950 Репутация автора

В зависимости от параметров вашей почтовой команды (проверьте это с помощью man mail) и версии вы можете сделать

echo yourBody|mail -s yoursubject -A /your/attachment/file john@doe.com

Автор: Pipo Размещён: 12.06.2019 11:43
Вопросы из категории :
32x32