我使用 Postfix + Dovecot,以 MySQL 数据库作为后端,并使用 PostfixAdmin 来管理用户和域。现在我正在寻找一个简单的和自动化定义模式的每个域别名的方法[email protected]
将解析为给定域的所有用户。我希望设置一次,即使添加或删除帐户,它仍将按预期工作 - 因此手动创建包含帐户列表的文件或使用某些邮件列表都不是选项。
从数据库中检索给定域的所有现有用户应该非常容易:
SELECT username
FROM vmail
WHERE domain='%d';
(作为%d
域的占位符)。但是我如何告诉 postfix 对发往 的邮件执行此操作[email protected]
,当然只有当此类邮件来自受信任的来源(permit_sasl_authenticated
,permit_mynetworks
?)时才执行此操作?
我已经在 Google 上搜索了几个小时,但我找到的要么是“catch-alls”(与我想要的正好相反),要么是基于 shell 脚本的解决方案(遍历域目录),要么是使用邮件列表方法 —— 这些都不符合我的需要。
答案1
您可以使用virtual_alias_maps
定义别名[电子邮件保护]. 这里使用的格式虚拟 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 发送或由经过身份验证的用户发送时,它将允许电子邮件发送到 all@domain,但此后拒绝。