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

前端之家收集整理的这篇文章主要介绍了创建后缀别名“all@domain.tld”以发送给域的所有用户前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Postfix Dovecot和 MySQL数据库作为后端,使用PostfixAdmin来管理用户和域.现在我正在寻找一种简单且自动化的方法来定义模式all@domain.tld的每个域别名,并将解析给给定域的所有用户.我想设置一次,即使添加删除帐户,它仍将按预期工作 – 因此手动创建包含帐户列表的文件,或使用某些邮件列表是没有选项的.

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

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

(%d是域的占位符).但是,我怎么能告诉postfix这样做的邮件是针对all@domain.tld的邮件,当然只有当这样的邮件来自可靠的来源时(permit_sasl_authenticated,permit_mynetworks?)?

我现在用谷歌搜索了几个小时,但我发现的只是“全能”(与我想要的完全相反),基于shell脚本的解决方案(走在resp.域名目录下),或者使用邮件 – 列表方法 – 这些都不符合我的需求.

解决方法

您可以使用virtual_alias_maps定义别名all@example.com.这里是 virtual 5使用的格式.
pattern address1,address2,address3,...@H_301_5@ 
 

因此,您需要构造查询以连接所有行.取自此主题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'@H_301_5@ 
 

这需要转到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'@H_301_5@ 
 

(可能需要全部在一行 – 这里的格式化只是为了使它更容易阅读).

要仅允许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@H_301_5@ 
 

在/etc/postfix/restrict.all.alias中,定义

/^all@/  REJECT access denied@H_301_5@ 
 

当从mynetworks发送或由经过身份验证的用户发送时,它将允许向所有@域发送电子邮件,但在此之后拒绝.

原文链接:https://www.f2er.com/html/228766.html

猜你在找的HTML相关文章