You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:10:36