Как отправить письмо с вложением из оболочки UNIX? Есть несколько вариантов, я рассмотрю самые простые, – системными средствами и сторонним ПО.
mail + uuencode
Почти наверняка самый рабочий способ на любой системе.
1 | ~> ( echo "body text message" ; echo ; cat file .txt | uuencode file .txt ) | mail -s 'Subject' to@domain.tld |
в почтовый ящик придет сообщение в виде:
Message-Id: <20111205165235.0DB932ECAC@dom.tld> |
Date: Mon, 5 Dec 2011 16:52:35 +0000 (UTC) |
From: sender@domain.tld (sender) |
M< "`W-S<@;60P(" ]M>7-Q;%]T;7`*(R,M+2TM+2TC(PT*26YC;W)R96-T(&EN |
M;F1E> "YP:'`[(&-D(" T[(&QS( "UL82`D:2]I;F1E>" YP:'`[(&1O;F4*(R,M |
Плюсы: универсальный способ, не требует установки дополнительного ПО
Минусы: не все почтовые клиенты понимают этот формат и письмо возможно придется раскодировывать. Если вы пользуетесь почтой Гугла (GMail) – вам повезло, такой формат он понимает и файл можно будет скачать как обычный прикрепленный файл.
mail + base64
~> cat file .txt | base64 | mail -s 'Subject' to@dom.tld |
~> cat file .txt | uuencode -m file .txt | mail -s 'Subj' to@dom.tld |
Плюсы: файл в письме отправится
Минусы: письмо наверняка будет не понято почтовым клиентом и вложение будет просто выведено в виде текста, который нужно дополнительно распаковывать. GMail такие письма не понимает.
sendmail
~> ( cat header ; cat ssh .txt | base64 ) | /usr/sbin/sendmail -t |
~> ( cat header ; cat ssh .txt | uuencode -m ssh .txt ) | /usr/sbin/sendmail -t |
~> ( cat header ; cat ssh .txt | uuencode ssh .txt ) | /usr/sbin/sendmail -t |
В файл header предварительно внесены необходимые заголовки:
Content-Type: text/plain; charset=UTF-8 |
Content-Disposition: attachment; filename= "file.txt" |
Content-Transfer-Encoding: base64 |
Здесь мы явно указываем кодировку файла (UTF-8), имя файла, которое будет показываться в письме (может не совпадать с именем файла, который мы кодируем) и метод кодирования (base64). В третьем примере файл будет закодирован в uuencode, это тоже может вызвать сложности у почтовых клиентов. uuencode –m, в отличие от base64, помечает начало и конец закодированных данных, так же, как и просто uuencode. В первом случае начало данных будет помечено строкой:
begin-base64 644 file .txt |
конец:
во втором случае:
конец:
Плюсы: письмо понимается большинством почтовых клиентов
Красиво и по всем правилам отправить письмо можно с помощью скрипта:
04 | SUBJECT= "Letter with attachement" |
08 | boundary= "---text-for-mime-boundary---$$--" |
09 | DATE=` date + "%a, %e %Y %T %z" ` |
17 | Content-Type: multipart/mixed; boundary= "$boundary" |
18 | Content-Disposition: inline |
21 | Content-Type: text/plain; charset=us-ascii |
22 | Content-Disposition: inline |
24 | Body message: This email has attached the file |
27 | Content-Type: $MIME;name= "$attachment" |
28 | Content-Disposition: attachment;filename= "$attachment" |
29 | Content-Transfer-Encoding: $ENCODING |
35 | echo "--$boundary--" ) | sendmail -t |
Можно допилить этот скрипт, чтобы он принимал вложение (имя файла).
Как определить кодировку файла?
1 | ~> file -i -b u- file .txt |
2 | text/plain charset=utf-8 |
4 | text/plain charset=unknown |
В моем случае cp1251 и koi8-r не определяются(
mutt
1 | ~> echo "Body message" | mutt -a file .txt -s "Subject" -- to@dom.tld |
2 | ~> echo "Body message" | mutt to@dom.tld -s "Subject" -a ssh .txt |
Если указан ключ -a, необходимо указывать — перед указанием адресата, т.к. с этим ключом можно указывать несколько файлов для прикрепления к письму.
Плюсы: удобно отправлять один или несколько файлов во вложении.
Минусы: кириллические файлы в формате UTF-8 могут не открываться в GMail или почтовом клиенте, т.к. тип text/plain mutt кодирует по умолчанию как quoted-printable, а не base64. Для насильного кодирования текстовых файлов в base64 можно создать файл:
1 | ~> echo "application/octet-stream txt" >> ~/.mime.types |
mailx
Точнее, heirloom-mailx:
1 | ~> echo "Body message" | /usr/ local /bin/mailx -a 1.txt -s "Subject" to@dom.tld |
2 | ~> echo "Body message" | /usr/ local /bin/mailx -a 1.txt -a 2.txt -s "Subject" to@dom.tld |
Так можно отправить один или два файла во вложении. В отличие от mutt, для каждого файла нужно добавлять ключ -a.
mailx помечает текстовый файл как application/octet-stream, а не text/plain.
mutt и mailx можно установить из портов, /usr/ports/mail/heirloom-mailx и /usr/ports/mail/mutt соответственно.
Плюсы: удобно отправлять один или несколько файлов во вложении.
Как насчет быстроты выполнения?
выполнятся быстро