вторник, 17 марта 2009 г.

Отправка почты из командной строки

Не бывает без проблем =). Получается, что я очень мало знаю о Linux. Можно сказать, что ни чего не знаю. Когда я настраивал postfix мне потребовался консольный почтовый клиент. Ундекс посоветовал mutt. С тех пор я им и пользуюсь.

В какой то момент мне потребовалось отправлять почту из командной строки, без какого либо интерфейса. Решение оказалось очень простым. Программой mutt можно пользоваться и без интерактивного интерфейса, но на стандарный вход необходимо направить текст письма:

# echo "текст письма" | mutt user@domain -s "тема письма"

Для отправки письма нескольким адресатам, их e-mail можно перечислить через запятую.

При необходимости вложить в письмо файл, можно использовать опцию -a:

# echo "текст письма" | mutt user@domain -s "тема письма" -a file.jpg

В некоторых случаях удобно использовать отдельный конфигурационный файл muttrc, например мне необходимо указать обратный адрес, отличный от основного. Для этого есть опция -F:

# echo "текст письма" | mutt user@domain -s "тема письма" -F /path/muttrc

Есть еще одна опция которая мне понравилась -i, но практический смысл ее использования от меня ускольает. Эта опция позволяет вложить вложить текст в тело письма. Фактически в скрипте можно заранее подготовить текст письма или заранее его заготовить и используя -i вставить его в письмо, но это все равно не избавляет от необходимости подачи на stdin чего либо. В результате я вижу три идентичных варианта:

# echo | mutt user@domain -s "тема письма" -i Текст.txt
# cat Текст.txt | mutt user@domain -s "тема письма"
# mutt user@domain -s "тема письма" < Текст.txt

В процессе использования в различных скриптах подобных конструкций по автоматической отпрвке писем наткнулся на интересное поведение восклицательного знака "!" в теме письма. Если отправка из командной строки выполняется из скрипта, то все коректно отрабатывает. При попытке отправить руками из командной строки, при наличии восклицательного знака в теме письма, консоль переходит в режим ожидания ввода stdin. Очень похоже, что это происходит из за не верной трактовки bash самой строки, но в скрипте, использование восклицательного знака работает корректно.

Комментариев нет: