DBMail. Прикручиваем к Postfix.
Помимо Exim, мне часто приходится работать с Postfix. В том числе приходилось использовать postfix в связке с DBMail. Про установку и настройку DBMAil я рассказывал в статье: DBMail. Почтовый сервер c MySQL хранилищем писем. Прикручивается DBMail к постфикс не на много сложней, чем к Exim. И так же как Exim, postfix должен поддерживать MySQL.
Далее все просто.
Используя имеющиеся данные, те которые мы использовали в статье
DBMail. Почтовый сервер c MySQL хранилищем писем.
В первую очередь впишем имя домена, для которого будем принимать почту. Для этого в файле /usr/local/etc/postfix/main.cf найдем строку:
mydestination = $myhostname, localhost.$mydomain, localhost |
и добавим в конце домен hilik.org.ua:
mydestination = $myhostname, localhost.$mydomain, localhost, hilik.org.ua |
Почту мы будем доставлять от постфикса к DBMail по протоколу LMTP, для этого подредактируем файл /usr/local/etc/postfix/master.cf
Добавим в конце такую строку:
dbmail-lmtp unix - - n - - lmtp |
Теперь перенаправим всю почту для локального домена на DBMail, для этого внесем такую строку в /usr/local/etc/postfix/main.cf, строку тоже добавим в конце:
mailbox_transport = dbmail-lmtp:127.0.0.1:24 |
Теперь получается, что в принципе все работает, за исключением того, что postfix не знает ничего о тех пользователях, которые есть у DBMail.
Именно, для того, что бы postfix мог сам узнать, принимать или нет письмо для конкретного e-mail, нам и нужна была поддержка MySQL в постфикс.
По этому поводу, кстати, есть большая странность. Везде и в документации и на всех сайтах упоминается только обращение к таблице dbmail_alias, но у меня в этой таблице находятся только алиасы. Что вполне логично. А почтовые ящики находятся в таблице dbmail_users. Поэтому в /usr/local/etc/postfix/main.cf я внес поиск по двум таблицам.
Для этого находим такую строку в /usr/local/etc/postfix/main.cf:
local_recipient_maps = proxy:unix:passwd.byname $alias_maps |
и заменяем их на:
local_recipient_maps = mysql:/usr/local/etc/postfix/dbmail-aliases.cf mysql:/usr/local/etc/postfix/dbmail-recip.cf |
Первый файл /usr/local/etc/postfix/dbmail-aliases.cf отвечает за поиск получателей по таблице dbmail_aliases, то есть ищет алиасы, содержимое у него такое:
#Пользователь от которого подключаемся к MySQL user = dbmail #Пароль для подключения к MySQL password = dbmail-123 #Адрес сервера MySQL hosts = localhost # dbname = dbmail #Таблица базы по которой надо искать алиасы table = dbmail_aliases #Поле в котором находятся алиасы select_field = alias #Это же поле алиасов для использования в where where_field = alias |
Аналогично и для поиска пользователей, файл /usr/local/etc/postfix/dbmail-recip.cf, содержимое его такое:
user = dbmail
password = dbmail-123
hosts = localhost
dbname = dbmail
table = dbmail_users
select_field = userid
where_field = userid |
Теперь нужно перезагрузить конфигурацию postfix:
postfix reload |
И теперь проверим работоспособность, все данные и пользователи добавлены так, как описано в статье: DBMail. Почтовый сервер c MySQL хранилищем писем.
То есть у нас есть пользователь sh@hilik.org.ua и у него еще есть алиас hilik@hilik.org.ua.
Вот к ним и проверим доставку писем. Для этого с помощью telnet сэмулируем smtp сессию.
Для sh@hilik.org.ua:
telnet localhost 25 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 zapp.hilik.org.ua ESMTP Postfix ehlo sh.hilik.org.ua 250-zapp.hilik.org.ua 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN mail from:<> 250 2.1.0 Ok rcpt to:<sh@hilik.org.ua> 250 2.1.5 Ok |
В ответ на комманду rcpt to:
И теперь для алиаса hilik@hilik.org.ua:
telnet localhost 25 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 zapp.hilik.org.ua ESMTP Postfix ehlo sh.hilik.org.ua 250-zapp.hilik.org.ua 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN mail from:<> 250 2.1.0 Ok rcpt to:<hilik@hilik.org.ua> 250 2.1.5 Ok |
И тут все нормально. Остается проверить с несуществующим emailом, проверим с spam@hilik.org.ua:
telnet localhost 25 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 zapp.hilik.org.ua ESMTP Postfix ehlo sh.hilik.org.ua 250-zapp.hilik.org.ua 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN mail from:<> 250 2.1.0 Ok rcpt to:<spam@hilik.org.ua> 550 5.1.1 <spam@hilik.org.ua>: Recipient address rejected: User unknown in local recipient table |
И тут мы получили вполне ожидаемый 550.
Все настроенно и работает правильно.