我使用 Postfix + Dovecot 和 MySQL 数据库作为后端和 PostfixAdmin 来管理用户和域。现在我正在寻找一种简单且自动化的方法来定义模式的每个域别名,all@domain.tld并将解析给给定域的所有用户。我想设置一次,即使添加或删除帐户,它也能按预期工作 - 因此手动创建一个包含帐户列表的文件,或使用某些邮件列表是没有选择的。
从数据库中检索给定域的所有现有用户应该很容易:
SELECT username
FROM vmail
WHERE domain='%d';
Run Code Online (Sandbox Code Playgroud)
(%d作为域的占位符)。但是我怎么能告诉 postfix 对定向到 的邮件这样做all@domain.tld,当然只有当这样的邮件来自受信任的来源(permit_sasl_authenticated,permit_mynetworks?)?
我已经用谷歌搜索了几个小时,但我发现的要么是“全能”(与我想要的正好相反),基于 shell 脚本的解决方案(遍历 resp. 域目录),或使用邮件 -列出方法——这些方法都不符合我的需求。
您可以使用virtual_alias_maps别名 all@example.com 来定义。这里是virtual 5使用的格式。
pattern address1, address2, address3, ...
Run Code Online (Sandbox Code Playgroud)
所以你需要构造查询来连接所有行。取自此线程:我可以将多个 MySQL 行连接到一个字段中吗?,您可以使用此查询。
SELECT GROUP_CONCAT(CASE WHEN active='1' THEN username ELSE NULL END separator ', ')
FROM vmail
WHERE DOMAIN='%d'
AND '%s'='all@%d'
Run Code Online (Sandbox Code Playgroud)
这需要转到您的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'
Run Code Online (Sandbox Code Playgroud)
(可能需要全部在一行中 - 此处的格式只是为了使其更易于阅读)。
要仅允许 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
Run Code Online (Sandbox Code Playgroud)
在 /etc/postfix/restrict.all.alias 中,定义
/^all@/ REJECT access denied
Run Code Online (Sandbox Code Playgroud)
当从 mynetworks 发送或由经过身份验证的用户发送时,它将允许向 all@domain 发送电子邮件,但在此之后拒绝。
| 归档时间: |
|
| 查看次数: |
2091 次 |
| 最近记录: |