У меня работает сервер 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 |
+----+-----------+------------------------+-------------------------------+