创建后缀别名“[email protected]”以发送给域内的所有用户

创建后缀别名“[email protected]”以发送给域内的所有用户

我使用 Postfix + Dovecot,以 MySQL 数据库作为后端,并使用 PostfixAdmin 来管理用户和域。现在我正在寻找一个简单的自动化定义模式的每个域别名的方法[email protected]将解析为给定域的所有用户。我希望设置一次,即使添加或删除帐户,它仍将按预期工作 - 因此手动创建包含帐户列表的文件或使用某些邮件列表都不是选项。

从数据库中检索给定域的所有现有用户应该非常容易:

SELECT username
  FROM vmail
 WHERE domain='%d';

(作为%d域的占位符)。但是我如何告诉 postfix 对发往 的邮件执行此操作[email protected],当然只有当此类邮件来自受信任的来源(permit_sasl_authenticatedpermit_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,但此后拒绝。

相关内容