пятница, 28 марта 2008 г.

Отправка e-mail писем с вложениями из консоли

Чтобы отослать электронное письмо из командной строки, можно воспользоваться утилитой mail. Также она может встречаться под названием mailx или Mail. Для отправки письма пишем следующую команду:

$ mail -s "Тема письма" pupkin@mail.ru
Привет!
Я пишу тебе из консоли!
Ctrl+D

Комбинация клавиш Ctrl+D (^D) с новой строки позволяет завершить ввод письма. После этого у меня появляется приглашение ввести получателя копии - просто жму "Enter", и письмо отправляется.

Если тело письма находится в файле, то можно просто воспользоваться перенаправлением входного потока:

$ mail -s "Письмо из файла" pupkin@mail.ru < mail_body.txt

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

$ ls | mail -s "Вывод команды" pupkin@mail.ru

Кроме того, утилита позволяет не только читать письма, но и получать их, отвечать и делать прочие полезные манипуляции. Но вот чего она, похоже, не позволяет - так это добавить вложение к письму. Однако, это не беда. Есть немало способов отправить файл из консоли по электронной почте. Я рассмотрю три из них, которые не потребовали от меня разбираться в чем-то или что-то скачивать/устанавливать.

1. Если нужно отправить двоичный файл письмом, можно его просто закодировать с помощью uuencode. Команда будет выглядет следующим образом:

$ uuencode image.jpg image.jpg | mail -s "Метод 1" sombeody@somewhere.net

И хотя файл действительно закодируется и отправится, это не является вложением в полном смысле электронной почты. некоторые почтовые клиенты адэкватно отреагируют на файл в письме, другие же покажут его как простой текст, и раскодировать его придется вручную.

2. С помощью консольной утилиты mpack. Эта утилита пакует файл в сообщение и отсылает полученное сообщение туда, куда изволите.

$ mpack -s "Метод 2" image.jpg sombeody@somewhere.net

3. С помощью полноценного консольного почтового клиента mutt. Можно запустить его, сформировать письмо и отправить куда надо. А можно запустить mutt в режиме эмуляции диалога mailx (параметр -x), при этом передав через параметры все необходимое, чтобы не получать лишних вопросов от этой программы. Второй вариант выглядит так:

$ echo "Смотри вложение" | mutt -x -s "Метод 3" -a image.jpg sombeody@somewhere.net

Если какой-то из программ у вас не окажется (в чем я сильно сомневаюсь), ищите ее в репозиториях Debian.

Пишите - и да будете отвечены! :-)

18 комментариев:

  1. А если вспомнить, что тысяча и одна программа умеют по какому-нить событию вызывать какую-нить программу, то кроме баловства можно и автоматизацией заниматься :)

    ОтветитьУдалить
    Ответы
    1. От таких как ты происходят GUIвые юзеры.
      А от таких как Автор - грамотные Линуксоиды.

      Удалить
  2. Вот поэтому и кажется мне эта возможность замечательной! И руки чешутся что-нибудь автоматизировать, но на практике кажется, что автоматизировать нечего :-) Поэтому и интересуюсь у народа, что именно он у себя автоматизирует :-)

    ОтветитьУдалить
  3. Совет интересный, я например не знал о таком. В задачах автоматизации может очень даже пригодиться.

    Меньше смайликов в тексте и больше примеров. В целом очень неплохо.

    ОтветитьУдалить
  4. Этот комментарий был удален автором.

    ОтветитьУдалить
  5. а как там с attachment-ами?

    ОтветитьУдалить
  6. Спасибо за вопрос. Смотрите ответ в новой версии статьи. :-)

    ОтветитьУдалить
  7. Каким образом отправляется письмо? Мой компьютер становится почтовым сервером? Каков шанс попадания в спам на популярных почтовика?
    PS Отправил себе на gmail.com и ya.ru - ничего не пришло.

    ОтветитьУдалить
  8. > Каким образом отправляется письмо?
    Это зависит от установленного MTA. По умолчанию - через sendmail.

    > Мой компьютер становится почтовым сервером?
    В определенном смысле да.

    > Каков шанс попадания в спам на популярных почтовика?

    100% :) Обычно принимающие сервера относят к спаму всю почту, отправленную с localhost.

    ОтветитьУдалить
  9. Каждые два дня нам нужно отправлять по электронной почте результаты медицинских анализов. Переодически делать это забывают :) Как раз стал думать над тем нельзя эту нехитрую операцию поручить скрипту. Спасибо за пост.

    ОтветитьУдалить
  10. >> Каков шанс попадания в спам на популярных почтовика?
    > 100% :) Обычно принимающие сервера относят к спаму всю почту, отправленную с localhost.

    И что же делать в таком случае?

    ОтветитьУдалить
  11. Этот комментарий был удален автором.

    ОтветитьУдалить
  12. Этот комментарий был удален автором.

    ОтветитьУдалить
  13. >>> Каков шанс попадания в спам на популярных почтовика?
    >> 100% :) Обычно принимающие сервера относят к спаму всю почту, отправленную с localhost.
    > И что же делать в таком случае?

    Например, настраивать MTA для работы через внешний SMTP. Как это сделать я описал здесь

    ОтветитьУдалить
  14. > Например, настраивать MTA для работы
    > через внешний SMTP. Как это сделать я
    > описал здесь

    Настроил как написали, через Postfix. Но когда запускаешь echo "Смотри вложение" | mutt -x -s "Метод 3" -a image.jpg sombeody@somewhere.net
    Он все ровно приходит письмо от локолхоста. Система Убунту 9.04

    ОтветитьУдалить
  15. а какую функцию выполняет ключик -s ?
    и значек | это он типа как горит выполнить 2 команды отновремено, типа типа результат 1 поместить во 2 и выполнить ? я правильно понимаю ?

    ОтветитьУдалить
  16. правильнее будет так
    echo "Смотри вложение" | mutt -x -s "Метод 3" -a image.jpg image2.jpg ... -- somebody@somewhere.net

    ОтветитьУдалить
  17. boris@boris-A24 ~ $ ls | mail -s "Вывод команды" user@mail.ru
    boris@boris-A24 ~ $ /usr/lib/sendmail: Отказано в доступе
    "/home/boris/dead.letter" 60/1103
    . . . message not sent.

    В чём проблема? При попытке отправить из-под sudo или рута то же самое.

    boris@boris-A24 ~ $ ls -l /usr/lib/sendmail
    -rw-r--r-- 1 root root 0 2013-02-01 18:31 /usr/lib/sendmail

    ОтветитьУдалить