Я использую Postfix + Dovecot с базой данных MySQL в качестве бэкэнда и PostfixAdmin для администрирования пользователей и доменов. Сейчас я ищу легко и автоматизированный подход к определению псевдонима для каждого домена шаблона all@domain.tld
with будет разрешено всем пользователям данного домена. Я хочу настроить это один раз, и он будет продолжать работать, как ожидалось, даже если учетные записи будут добавлены или удалены, поэтому создание файла со списком учетных записей вручную или использование какого-либо списка рассылки - это не варианты.
Получить всех существующих пользователей для данного домена из базы данных должно быть довольно легко:
SELECT username
FROM vmail
WHERE domain='%d';
(с участием %d
является заполнителем для домена). Но как я могу сказать postfix сделать это для писем, направленных на all@domain.tld
, и, конечно, только если такое письмо приходит из надежного источника (permit_sasl_authenticated
, permit_mynetworks
?)?
Я гуглил уже несколько часов, но все, что я нашел, были либо "уловками" (прямо противоположными тому, что я хочу), решениями, основанными на сценариях оболочки (прогулка по соответствующему каталогу домена), либо с использованием почтовых рассылок. список подходов - ни один из них не соответствует моим потребностям.
Ты можешь использовать virtual_alias_maps
для определения псевдонима all@example.com. Здесь формат, используемый виртуальный 5.
pattern address1, address2, address3, ...
Итак, вам нужно построить запрос для объединения всех строк. Взято из этой ветки: Могу ли я объединить несколько строк MySQL в одно поле?, вы можете использовать этот запрос.
SELECT GROUP_CONCAT(CASE WHEN active='1' THEN username ELSE NULL END separator ', ')
FROM vmail
WHERE DOMAIN='%d'
AND '%s'='all@%d'
Это нужно для вашего mysql_virtual_alias_maps.cf
и может быть добавлен к существующему запросу с помощью UNION
- так результат выглядит, например, как это:
query = SELECT goto FROM alias WHERE address='%s' AND active = '1' UNION
SELECT GROUP_CONCAT(CASE WHEN active='1' THEN username ELSE NULL END separator ', ')
FROM vmail
WHERE DOMAIN='%d'
AND '%s'='all@%d'
(может потребоваться, чтобы все было в одной строке - форматирование здесь просто применяется для облегчения чтения).
Чтобы разрешить только permission_mynetworks и permission_sasl_authenticated, поместите ограничение в следующем порядке
smtpd_recipient_restrictions = ....
permit_mynetworks
permit_sasl_authenticated
check_recipient_access regexp:/etc/postfix/restrict.all.alias
reject_unauth_destination
В /etc/postfix/restrict.all.alias определите
/^all@/ REJECT access denied
Он разрешит электронную почту для всего домена @ при отправке из mynetworks или от авторизованного пользователя, но после этого отклонит.