我使用Postfix + Dovecot作为后端和PostfixAdminpipe理用户和域。 现在我正在寻找一种简单的 自动化方法来定义模式的域名别名[email protected] ,并将parsing给定域的所有用户。 我想设置一次,即使帐号被添加或删除,它也会保持正常工作 – 所以手动创build一个包含帐号列表的文件,或者使用一些邮件列表是没有select的。
从数据库中检索给定域的所有现有用户应该相当容易:
SELECT username FROM vmail WHERE domain='%d';
( %d是该域的占位符)。 但是我怎么能告诉postfix这样做的邮件指向[email protected] ,当然,只有当这样的邮件来自可信来源( permit_sasl_authenticated , permit_mynetworks ?)?
我已经search了几个小时了,但是我发现的只有“catch-alls”(正好与我想要的相反),基于shell脚本的解决scheme(遍历域名目录)列表方法 – 这些都不符合我的需求。
您可以使用virtual_alias_maps来定义别名[email protected]。 这里的虚拟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'
(可能需要全部在一行中 – 这里的格式只是为了使阅读更容易)。
要仅允许permit_mynetworks和permit_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发送或由authentication的用户发送,但拒绝之后。