Mutt, ssmtp и отправка отчетов

    В свое время, когда меня еще не было на Хабре, эта статья была опубликована в песочнице. К сожалению, она никому не понравилась и со временем была удалена. Долго думал, что с ней делать — забить, запостить таки на Хабре или в своем блоге Записки программиста. Решил, раз она писалась для Хабра, пусть на нем и будет опубликована. Итак, под катом — статья о практике отправки отчетов по e-mail. Сейчас, перечитывая текст, понимаю, что статья — не фонтан, но может кому-нибудь пригодится.

    Часто передо мной встает задача вроде такой: необходимо ежемесячно (или еженедельно/ежедневно) обработать такие-то логи, построить по ним отчет и отправить его на заданный E-Mail. В этой статье я как раз хотел бы рассказать о второй части такой задачи, а именно об отправке отчетов. Казалось бы, такая рутинная операция, но трудности с ней возникают чаще, чем может показаться на первый взгляд.

    Я предпочитаю использовать уже готовые, проверенные временем, программы, а не писать каждый раз собственные скрипты. В большинстве случаев нужная программа уже была когда-то кем-то написана, зачем изобретать велосипед?

    Для отправки отчетов я пользуюсь mutt. В нем меня привлекает простота интерфейса, возраст (читай — стабильность) программы и то, что mutt портирован если не под все, то почти под все unix-like системы. В моей любимой FreeBSD искать его следует в /usr/ports/mail/mutt.

    Чтобы при помощи mutt послать письмо с аттачем, достаточно команды

    mutt -s Subject -a File User@Host.com

    где Subject — тема сообщения, File — имя прикрепляемого файла, а User@Host.com — получатель письма. К письму можно прикрепить несколько файлов или указать несколько получателей. Текст письма программа читает из stdin.

    По умолчанию mutt использует sendmail в качестве MTA. Обычно с этим не возникает трудностей — после установки mutt мы можем сразу приступить к написанию скриптов и все будет прекрасно работать. Но мне приходилось сталкиваться с ситуацией, когда посылка писем напрямую с сервера просто запрещена правилами фаервола. В этом случае следует использовать сторонний SMTP сервер.

    Проблема в том, что mutt не имеет функций MTA, то есть работа с SMTP — не его задача. Тем не менее, можно научить его слать почту через заданный smtp-сервер и поможет ему в этом программа ssmtp.

    Строго говоря, ssmtp является не MTA, а просто smtp-клиентом, эмулирующим работу sendmail. Если вы, как и я, пользуетесь FreeBSD, то можете поставить ssmtp из портов — /usr/ports/mail/ssmtp.

    Настройка ssmtp производится путем редактирования файла /usr/local/etc/ssmtp/ssmtp.conf (в вашей ОС путь к файлу может быть другим). Вот как он примерно выглядит:

    root=reports@example.ru # от чьего имени шлем письма
    mailhub=smtp.example.ru:465 # smtp-сервер и порт
    hostname=localhost # имя нашего хоста, желательно вписать верное
    UseTLS=Yes # используем зашифрованное соединение
    AuthUser=reports@example.ru # логин
    AuthPass=qwerty # пароль
    FromLineOverride=Yes # Поле From: может задавать mutt


    Если вы хотите слать отчеты через Gmail, конфиг будет выглядеть немного иначе:

    root=reports@gmail.com
    mailhub=smtp.gmail.com:587
    hostname=localhost
    UseSTARTTLS=YES
    AuthUser=reports@gmail.com
    AuthPass=qwerty


    Пытаемся послать тестовое письмо с помощью ssmtp:

    echo "" | ssmtp -v -s Hello admin@example.ru

    Если письмо успешно дошло, значит все было сделано правильно. Если ssmtp говорит нечто вроде:

    . . .
    [->] MAIL FROM:<root@localhost>
    [<-] 573 root@localhost failed to route the address
    ssmtp: 573 root@localhost failed to route the address


    тоже не проблема, просто ssmtp указал неверный адрес отправителя, и smtp-сервер это заметил. Когда будем слать почту через mutt, все будет задано верно.

    Чтобы mutt слал почту через ssmtp, в домашнем каталоге пользователя, от имени которого мы собираемся слать отчеты, нужно подправить файл .muttrc

    set sendmail="/usr/local/sbin/ssmtp" # путь к ssmtp
    set realname="Example Report System" # имя отправителя
    set from="reports@example.ru" # e-mail отправителя


    Проверяем работу mutt:

    echo "" | mutt -s Hello admin@example.ru

    Письмо должно успешно дойти до получателя. Если вы хотите использовать mutt в скриптах, запускаемых по крону, нужно иметь ввиду, что mutt находится в каталоге /usr/local/bin, который по умолчанию не прописан в переменную окружения PATH в вашем crontab. Решения два — либо исправить переменную окружения PATH в кронтабе, либо использовать полное имя mutt в скриптах.

    Бывает и такое, что на сервере, с которого приходится слать отчеты, у нас нет root-привилегий. В этом случае либо придется уговаривать админа установить и настроить mutt, либо все-таки написать свой собственный скрипт отправки электронной почты. Но это уже совсем другая история.
    • +4
    • 42,6k
    • 5
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 5
    • 0
      Тоже самое делал только юзал mail+postfix, при этом юзался гмайловский аккаунт, необходимо было знать ип машинки, но у неё был динамический белый ип, при том про ddns я тогда не знал, и вот такой же схемкой высылал себе на мыло раз в полчаса новый ип ;)
      • 0
        для таких задач postfix тяжел, самый дешёвый и простой вариант — esmtp, у меня во всех джейлах крутится
      • 0
        Да, судя по оценке и количеству ответов, статья и вправду посредственная *краснеет*
        • 0
          Бывает и такое, что на сервере, с которого приходится слать отчеты, у нас нет root-привилегий. В этом случае либо придется уговаривать админа установить и настроить mutt, либо все-таки написать свой собственный скрипт отправки электронной почты. Но это уже совсем другая история.
          Неужели он так написан, что не позволяет установить его в свою папку? :)
          • 0
            Вы ssmtp не донастроили:) Я набил пару шишек, начеркал howto по настройке ssmtp с яндексом и гуглом, в том числе для доменов.

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