Назад | Перейти на главную страницу

Postfix + mysql: virtual_users в сочетании с универсальным в virtual_aliases

У меня работает сервер Postfix (и Dovecot), использующий MySQL для определения доменных имен, пользователей и псевдонимов. Все работает нормально, но теперь я хочу добавить комплексную информацию в домен, для которого у меня уже определены некоторые пользователи. Я добавил пользователя в таблицу virtual_users, и, хотя я могу подключиться к нему и отправлять с ним электронные письма, все отправляемые ему электронные письма фиксируются системой catch-all. Есть ли способ решить эту проблему?

Соответствующие файлы конфигурации и детали:

/etc/postfix/main.cf:

virtual_transport = lmtp:unix:private/dovecot-lmtp  
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf  
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf  
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf  
local_recipient_maps = $virtual_mailbox_maps  

Таблица виртуальных пользователей mysql:

+----+-----------+--------------+------------------------+  
| id | domain_id | password     | email                  |  
+----+-----------+--------------+------------------------+  
|  2 |         1 | passwordhash | postmaster@example.com |  
+----+-----------+--------------+------------------------+  

Таблица виртуальных псевдонимов mysql:

+----+-----------+------------------------+-------------------------------+  
| id | domain_id | source                 | destination                   |  
+----+-----------+------------------------+-------------------------------+  
|  2 |         1 | @example.com           | catch-all@other.example.net   |  
+----+-----------+------------------------+-------------------------------+  

По умолчанию postfix всегда ищет в virtual_alias_maps первый. Таким образом, он всегда перекрывает другую запись на других картах (например: alias_maps и virtual_mailbox_maps). Поэтому нам нужно исключить адрес электронной почты, указанный в virtual_mailbox_maps.

Чтобы исключить его, нам нужно создать новую карту mysql для virtual_alias_maps в main.cf

virtual_alias_maps = mysql:/etc/postfix/mailbox.cf, mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Затем в mailbox.cf определите запрос

SELECT email from VIRTUALUSERTABLE WHERE email = %s

Вот и все. Вам нужен запрос, поэтому поиск ключа result =. Когда это происходит, postfix не будет использовать псевдоним электронной почты для всех пользователей.

Ссылка: постфиксный учебник

Я нашел это поиском аналогичной проблемы с нашей системой. Добавление mailbox.cf не сработало для нас, так как он обходит любые пересылки в почтовые ящики в том же домене. Если вам нужно перенаправить на почтовые ящики в том же домене, где установлен общий адрес, вам необходимо добавить адрес источника и назначения в таблицу виртуальных псевдонимов.

Например, в вопросе выше, если вы перенаправляете postmaster@example.com на admin@example.com, admin@example.com не увидит письмо. Он будет приходить только на postmaster@example.com

«Более конкретные псевдонимы имеют приоритет над общими псевдонимами». Видеть: https://workaround.org/book/export/html/376

Вместо добавления mailbox.cf установите дополнительные форварды, как это, для того же домена:

+----+-----------+------------------------+-------------------------------+  
| id | domain_id | source                 | destination                   |  
+----+-----------+------------------------+-------------------------------+  
|  1 |         1 | postmaster@example.com | admin@example.com             |  
|  2 |         1 | postmaster@example.com | postmaster@example.com        |  
+----+-----------+------------------------+-------------------------------+