понедельник, 7 апреля 2008 г.

Настройка MTA для Mutt. Отправка почты через внешний SMTP сервер.

Главное преимущество Mutt, как почтового клиента (по моему мнению), это то - что он консольный. Если кто-то не считает это преимуществом, то дальше можете не читать :). Но, если не менять настройки, mutt просто передает исходящую почту локальному MTA (mail transfer agent), который уже отправляет почту по своему усмотрению. По умолчанию это усмотрение сводится к тому, чтобы отправить почту с localhost (локального доменного имени любого компьютера). Письма, отправленные с такого адреса, обычно классифицируются как спам и до получателя не доходят. Но выход есть.

Выходов даже несколько, но я рассмотрю только один - настройку MTA для работы через внешний SMTP сервер (в данном случае gmail) вместо отправки почты с localhost. Поскольку MTA существуют самые разные и многим нравится только какой-то определенный, я попытаюсь описать настройку нескольких популярных MTA.

1. Sendmail
Классический Sendmail многим не нравится из-за сложной настройки, но все-таки это очень мощный и достаточно распространенный MTA. Итак (все действия будут выполнятся пользователем root),

# apt-get install sendmail

Добавим несколько строк в /etc/mail/sendmail.mc для того, чтобы Sendmail отсылал почту через gmail (добавлять эти строчки нужно до параметров MAILER, иначе потом будет ошибка при сборке конфигов).

define(`SMART_HOST',`smtp.gmail.com')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`RELAY_MAILER',`esmtp')dnl
define(`RELAY_MAILER_ARGS', `TPC $h 587')dnl
FEATURE(`authinfo',`hash /etc/mail/auth/client-info')dnl

Теперь создадим папку /etc/mail/auth, а в ней - файл client-info, в котором будут храниться наши логин и пароль для my.name@gmail.com.

# mkdir /etc/mail/auth
# touch /etc/mail/auth/client-info

Добавим в client-info наши параметры авторизации (my.name заменим на свой логин на gmail, а password - на пароль).

AuthInfo:smtp.gmail.com "U:root" "I:my.name" "P:password" "M:PLAIN"
AuthInfo:smtp.gmail.com:587 "U:root" "I:my.name" "P:password" "M:PLAIN"

Для пущей безопасности можно сделать этот файл (да и папку тоже) доступными только для пользователя root

# chmod 600 /etc/mail/auth/client-info
# chmod 700 /etc/mail/auth

Преобразуем этот файл в нужный формат

# makemap -r hash /etc/mail/auth/client-info.db < /etc/mail/auth/client-info

Теперь выполним одно специфичное для Sendmail действие - пересборку конфигурационных файлов

# cd /etc/mail
# make

И наконец перезапускаем MTA для применения изменений

# /etc/init.d/sendmail reload

Готово. Можно отправлять почту.

2. Postfix
Postfix обладает всей мощью Sendmail, будучи полностью с ним совместимым, но при этом он гораздо проще в конфигурации. Кроме того, это мой любимый MTA, так что я не мог обойтись без описания его настройки. Итак (все действия производятся от имени root),

# apt-get install postfix

Скопируем главный настроечный файл postfix в нужное место (почему-то в Kubuntu он не устанавливается по-умолчанию)

# cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf

В конец этого файла добавим несколько строк, чтобы настроить доставку почты через gmail.

relayhost = smtp.gmail.com:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/gmail_passwd
smtp_sasl_security_options = noanonymous

Теперь создадим указанный нами файл авторизации

# touch /etc/postfix/gmail_passwd

и добавим в него наши логин и пароль на gmail (my.name заменяем на логин, а password - на пароль).

smtp.gmail.com:587 my.name@gmail.com:password

Преобразуем этот файл в нужный формат (BDB) и для пущей безопасности защитим его от доступа простых смертных.

# postmap /etc/postfix/gmail_passwd
# chown root:postfix /etc/postfix/gmail_passwd*
# chmod 0640 /etc/postfix/gmail_passwd*

Перезапускаем Postfix для применения изменений.

# /etc/init.d/postfix restart

Настройка закончена. MTA готов к отправке почты через gmail.

3. Exim
Exim - один из самых популярных (и мощных) MTA. Именно его мне советовала Kubuntu при установке Mutt. Кроме того, exim уже упоминался в этом блоге, так что описание его настройки вполне закономерно. Итак (всё делаем с правами root),

# apt-get install exim4

Отредактируем следующие параметры в файле /etc/exim4/update-exim4.conf.conf, чтобы отправлять почту через gmail

dc_eximconfig_configtype='smarthost'
dc_smarthost='smtp.gmail.com::587'

В файл авторизации /etc/exim4/passwd.client добавим следующие строки (подставляем свои логин и пароль вместо my.name и password соответственно)

gmail-smtp.l.google.com:my.name@gmail.com:password
*.google.com:my.name@gmail.com:password
smtp.gmail.com:my.name@gmail.com:password

Выполним следующую команду для применения новых настроек

# update-exim4.conf

На этом настройка завершена. Exim будет отправлять почту через gmail.

4. Msmtp
Как справедливо заметил Che (см. комментарии после статьи), использовать такие мощные MTA, как три предыдущие, в данной ситуации не рационально. Поэтому в данном случае, msmtp ничем не хуже остальных. Конечно, на его основе нельзя построить полноценный почтовый сервер, но ведь в данном случае это и не требуется. Итак (на этот раз всё выполняем от имени обычного пользователя),

$ sudo apt-get install msmtp

Создаем локальный файл настройки

$ touch ~/.msmtprc

и добавляем в него следующие строки (подставляем вместо my.name свой логин на gmail, а вместо password - пароль)

account default
host smtp.gmail.com
port 587
auth on
tls on
tls_starttls on
tls_certcheck off
from my.name@gmail.com
user my.name@gmail.com
password password

Ограничим права на ~/.msmtprc

$ chmod 600 ~/.msmtprc

Теперь создадим символическую ссылку на msmtp, чтобы не менять настройки mutt

$ sudo ln -s /usr/bin/msmtp /usr/sbin/sendmail

И на этом настройка завершена. Можно отправлять почту.

Ну вот пока и всё. Если вдруг вашего любимого MTA в этой статье не оказалось, то, как говорит Raa, пишите - и да будете отвечены! :)

23 комментария:

  1. Мне все таки кажется, что использовать полновесный MTA не на сервере - идея не слишком здравая :)

    Когда-то давно я использовал postfix на локальной машине, но потом понял, что это как из пушки по воробьям стрелять :)

    Все таки на рабочей станции больше подходят более простые вещи. Типа msmtp.

    ОтветитьУдалить
  2. А это чем не "механизм"?
    http://www.mutt.org/doc/devel/manual.html#smtp
    Мут хорош не только тем, что он консольный :)

    ОтветитьУдалить
  3. Анонимный11 мая 2008 г., 11:39

    А как на счет того что посто при сборки пакета mutt собрать с imap и все нормально )

    ОтветитьУдалить
  4. Как связанна отправка почты с imap?

    ОтветитьУдалить
  5. > Мне все таки кажется, что использовать полновесный MTA не на сервере - идея не слишком здравая :)

    Полностью согласен. Первоначально в статье было задумано описать четыре MTA и последним должен был быть как раз очень легкий nullmailer, но в последний момент оказалось, что он не поддерживает TLS, а значит с gmail работать не сможет.

    > Все таки на рабочей станции больше подходят более простые вещи. Типа msmtp.

    Статья дополнена описанием msmtp

    ОтветитьУдалить
  6. > А это чем не "механизм"?
    > http://www.mutt.org/doc/devel/manual.html#smtp

    Очевидно, я немного отстал от жизни. Текст вступления исправлен с учетом свежей информации. К сожалению, данное решение не вписывается в тему статьи, так что я опишу его в этом комментарии.
    Итак, mutt может отправлять почту непосредственно через gmail (или другой smtp сервер). Для этого достаточно добавить всего одну строчку в /etc/Muttrc или ~/.muttrc (или же ~/.mutt/muttrc)

    set smtp_url=smtp://my.name:password.gmail.com:587/

    Данный пример приводится, естественно, для gmail. Я бы рекомендовал эту строчку добавлять не в глобальный файл, а в ~/.muttrc, так как эта строка содержит логин и пароль в явном виде. И для пущей безопасности сделать

    $ chmod 600 ~/.muttrc

    > Мут хорош не только тем, что он консольный :)

    Я писал, что это главное преимущество, а не единственное. Читайте внимательнее :)

    ОтветитьУдалить
  7. > А как на счет того что посто при сборки пакета mutt собрать с imap и все нормально )

    А зачем его вообще собирать, если пакет из репозитория отлично работает? И при чём здесь imap?

    ОтветитьУдалить
  8. В принципе, собирать есть смысл. Я, например, собираю. По двум причинам:
    1. В репозитарии не слишком свежий пакет.
    2. Я использую патч sidebar. Очень удобная штука. http://lunar-linux.org/index.php?page=mutt-sidebar

    ОтветитьУдалить
  9. > В принципе, собирать есть смысл.

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

    ОтветитьУдалить
  10. Спасибо, Mak_s, давно хотел с этим разобраться :-)

    > А это чем не "механизм"?
    > http://www.mutt.org/doc/devel/manual.html#smtp

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

    http://debback.blogspot.com/2008/03/blog-post.html

    Или же автоматически какой-либо программой, использующей все тот же MTA, как в случае с cron'ом:

    http://debback.blogspot.com/2008/02/cron-mailto-exim.html

    ОтветитьУдалить
  11. > Если убрать из заголовка слово Mutt, тогда все станет на свои места.

    Можно было бы так и сделать. Но ведь придется всё вступление переписывать (и еще некоторые места), а я и так писал статью больше месяца :)

    ОтветитьУдалить
  12. > Можно было бы так и сделать. Но ведь придется всё вступление переписывать (и еще некоторые места), а я и так писал статью больше месяца :)

    Просто я имел в виду, что статья вовсе не стала бесполезной из-за того, что в Mutt можно указать SMTP сервер. Пусть все остается как есть :-)

    ОтветитьУдалить
  13. 2Mak_s

    поставил mutt
    установил переменную smtp_url
    но прои попытке отправки пишет

    Error in /root/.muttrc, line 1: smtp_url: unknown variable
    source: errors in /root/.muttrc

    и отсылает через sendmail
    в чем прикол???

    ОтветитьУдалить
  14. 2Сергей

    При такой скудной информации трудно что-то ответить (у меня никакой ошибки не возникало). Так что для начала несколько вопросов: Версия ОС? Версия Mutt? Как этот Mutt ставился (из репозитория, сторонних пакетов или собирался из исходников)? Какие параметры использовались при установке/сборке (по-умолчанию или что-то дополнительно)?

    ОтветитьУдалить
  15. 2Сергей
    И еще не помешало бы показать файл /root/.muttrc :-)

    ОтветитьУдалить
  16. Автор, спасибо тебе.
    Всё заработало с первого раза.
    А я уж было предвкушал, что полвечера буду разбираться, как почту через гугловский SSL SMTP отправлять. )))

    ОтветитьУдалить
  17. Настроил свой postfix в два счета! Спасибо.

    ОтветитьУдалить
  18. Настроил через Exim.

    Единственная проблема: Google, с…обака, переписывает заголовки From, Return-Path и т.п. на оригинальный адрес отправителя.

    Ни переписывание хеадеров при отправке письма, ни даже параметр “-f{$from}” не помогают.

    При этом Exim обрабатывает правильно:

    2011-02-02 10:24:02 1PkX4M-0001Nk-FJ <= from@bk.ru U=www-data P=local S=661
    2011-02-02 10:24:03 1PkX4M-0001Nk-FJ => to@domain.ru R=smarthost T=remote_smtp_smarthost H=gmail-smtp-msa.l.google.com [209.85.225.109] X=TLS1...
    2011-02-02 10:24:03 1PkX4M-0001Nk-FJ Completed

    Но почта на ящик приходит не от from@bk.ru, а от того ящика gmail, на который настроен Exim (типа vasya.pupkin@gmail.com).

    Даже не знаю, как с этим бороться. Кто что может посоветовать?

    ОтветитьУдалить
  19. Спасибо за статью, очень полезная )))
    А вы не когда не пробовали SSMTP ?

    ОтветитьУдалить
  20. использовал связку mutt+msmtp, так как считаю лишним на серваке иметь монструозное МТА всего лишь для отправки логов по почте.
    автору респект

    ОтветитьУдалить
  21. Подскажите пожалуйса, а если хостинг и много аккаунтов. И нужно иметь возможность чтобы авторизация происходила по разным smpt серверам с разными логинами и паролями и соответственно отправлялась с разных ящиков, что важно с реальными именами, причём всегда от пользователя Apache.
    Как сделать, так чтобы из From передавалось имя а e-mail подменялся. Какой MTA в данном случаи лучше использоваться.

    Фактически нужно чтобы MTA определял с какого сервера отправлять и с каким логином и паролям исходя из заголовков FROM. Причём оставляя при этом имя не тронутым а подменяя только e-mail. Может быть есть какие то другие варианты?

    Операционная система Centos 6x64 и Centos 7

    ОтветитьУдалить
  22. Пояснение к предыдущему комментарию: имеется ввиду что все хостинг аккаунты работают от пользователя apache

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