配置Exim基于文件存在性验证收件人(适配定制Mailman)
刚好之前做过适配定制Mailman的Exim收件人验证需求,这就给你一步步说明怎么配置:
适配定制版Mailman的Exim收件人验证配置
核心思路
我们需要在Exim的收件人检查环节(ACL)中,根据收件人地址动态构造对应的Mailman配置文件路径,通过检查该文件是否存在来决定是否接受邮件。
具体配置步骤
1. 定位Exim配置文件
首先找到你的Exim主配置文件,常见路径是:
- Debian/Ubuntu系:
/etc/exim4/exim4.conf - RHEL/CentOS系:
/etc/exim.conf
2. 编辑收件人检查ACL
找到配置中的acl_check_rcpt段(这是Exim处理收件人验证的核心ACL),在合适的位置添加以下规则:
# 验证定制Mailman列表的收件人存在性 deny message = Recipient address is not valid (no corresponding Mailman list configuration found) !condition = ${if file_exists{/var/lib/mailman/${lc:${substr{$local_part}{0}{1}}}/${lc:${substr{$local_part}{0}{2}}}/${split{$local_part}{_}{0}}/config.pck}{yes}{no}}
3. 规则细节解释
这条规则的逻辑是:当指定路径的配置文件不存在时,拒绝该收件人的邮件,下面拆解每个变量的作用:
${lc:...}:将提取的字符转为小写,避免因收件人地址大小写不一致导致路径匹配失败${substr{$local_part}{0}{1}}:提取收件人本地部分(@前面的内容)的第一个字符,比如mailing_address.tld提取出m${substr{$local_part}{0}{2}}:提取收件人本地部分的前两个字符,比如mailing_address.tld提取出ma${split{$local_part}{_}{0}}:将本地部分按下划线分割,取第一部分,比如mailing_address.tld提取出mailing${if file_exists{路径}{yes}{no}}:检查构造的路径是否存在,存在返回yes,否则返回no!condition:取反条件,当文件不存在时触发deny规则,返回设置的错误提示
4. 权限检查(重要)
确保Exim运行的系统用户(通常是exim或mail)拥有读取/var/lib/mailman目录下对应路径的权限:
- 可以将Exim用户加入Mailman组:
usermod -aG mailman exim - 或者调整目录和文件权限:
chmod 755 /var/lib/mailman/*/*/* && chmod 644 /var/lib/mailman/*/*/*/config.pck
测试验证
配置完成后,重启Exim服务:
- Debian/Ubuntu:
systemctl restart exim4 - RHEL/CentOS:
systemctl restart exim
然后用Exim自带的测试命令验证:
exim -bt mailing_address.tld@domain.tld
如果配置正确,当文件存在时会返回收件人可接受的信息;不存在则会返回我们设置的错误提示。
内容的提问来源于stack exchange,提问作者Joshi
相关产品推荐
相关产品推荐

