创建后缀别名“all@domain.tld”以发送给域的所有用户

Izz*_*zzy 4 postfix alias

我使用 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_authenticatedpermit_mynetworks?)?

我已经用谷歌搜索了几个小时,但我发现的要么是“全能”(与我想要的正好相反),基于 shell 脚本的解决方案(遍历 resp. 域目录),或使用邮件 -列出方法——这些方法都不符合我的需求。

mas*_*oeh 5

您可以使用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 发送电子邮件,但在此之后拒绝。