DBMail. Прикручиваем к Postfix во FreeBSD

Помимо 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: сервер ответил 250 – значит почту он примет для sh@hilik.org.ua

И теперь для алиаса 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.

Все настроенно и работает правильно.

http://www.hilik.org.ua/dbmail-прикручиваем-к-postfix/

Обновлено: 12.03.2015