我正在使用Postfix Dovecot和
MySQL数据库作为后端,使用PostfixAdmin来管理用户和域.现在我正在寻找一种简单且自动化的方法来定义模式all@domain.tld的每个域别名,并将解析给给定域的所有用户.我想设置一次,即使添加或删除帐户,它仍将按预期工作 – 因此手动创建包含帐户列表的文件,或使用某些邮件列表是没有选项的.
SELECT username FROM vmail WHERE domain='%d';
(%d是域的占位符).但是,我怎么能告诉postfix这样做的邮件是针对all@domain.tld的邮件,当然只有当这样的邮件来自可靠的来源时(permit_sasl_authenticated,permit_mynetworks?)?
我现在用谷歌搜索了几个小时,但我发现的只是“全能”(与我想要的完全相反),基于shell脚本的解决方案(走在resp.域名目录下),或者使用邮件 – 列表方法 – 这些都不符合我的需求.
解决方法
您可以使用virtual_alias_maps定义别名all@example.com.这里是
virtual 5使用的格式.
pattern address1,address2,address3,...
因此,您需要构造查询以连接所有行.取自此主题:Can I concatenate multiple MySQL rows into one field?,您可以使用此查询.
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