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

Создание постфиксного псевдонима «all@domain.tld» для отправки всем пользователям домена

Я использую 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 или от авторизованного пользователя, но после этого отклонит.