如何为特定用户绕过Postfix Milters?
如何为特定用户绕过Postfix Milters?
嘿,这个需求完全不用动milter的代码,Postfix本身就能通过配置实现,我给你分享两个实用的方案,都是配置层面的操作,上手很简单:
方案一:通过收件人访问表条件化禁用Milters
这是最直接高效的方法,利用Postfix的check_recipient_access规则,针对特定收件人临时覆盖全局的milter设置:
- 打开Postfix主配置文件
/etc/postfix/main.cf,找到smtpd_recipient_restrictions配置段,在reject_unauth_destination之前添加check_recipient_access规则(位置很重要,确保收件人验证后触发):
smtpd_recipient_restrictions = permit_mynetworks check_recipient_access hash:/etc/postfix/skip_milter_recipients reject_unauth_destination # 保留你原有的其他规则,比如 permit_sasl_authenticated 之类的
- 创建
/etc/postfix/skip_milter_recipients文件,在里面列出需要绕过milter的收件人,格式是收件人地址 + 制表符 + smtpd_milters=:
john@example.com smtpd_milters= support@example.com smtpd_milters= # 也支持域名通配,比如 @internal.example.com smtpd_milters=
- 生成哈希映射表并重载Postfix配置,让修改生效:
postmap /etc/postfix/skip_milter_recipients postfix reload
这样一来,当邮件的收件人匹配表中的条目时,Postfix会临时把smtpd_milters设为空值,直接绕过所有全局配置的milter;其他收件人的邮件则会正常走原有的milter流程,完全不冲突。
方案二:拆分SMTPD进程(适合复杂场景)
如果你的需求更复杂,比如需要给特定收件人搭配完全不同的邮件处理规则,也可以配置多个SMTPD监听进程:
- 打开
/etc/postfix/master.cf,复制一份现有的smtp监听配置,修改端口和参数,去掉milter相关配置:
smtp inet n - y - - smtpd # 新增的跳过milter的专属进程 smtp_skip_milter inet n - y - - smtpd -o smtpd_milters= -o smtpd_recipient_restrictions=permit_mynetworks,reject_unauth_destination,...(这里放适配这个进程的规则)
- 回到
main.cf,用check_recipient_access把特定收件人的邮件路由到这个新进程:
在skip_milter_recipients文件里添加:
vip@example.com transport=smtp:[127.0.0.1]:<你给新进程设的端口>
不过这个方案相对复杂,除非你有额外的流程需求,否则方案一更推荐。
小提醒
- 这个方法只对
smtpd_milters(针对SMTP接收的外部邮件)生效;如果你配置了non_smtpd_milters(针对本地生成的邮件),可以用类似逻辑,在local_recipient_maps里设置non_smtpd_milters=。 - 修改配置后一定要测试,比如给目标收件人发测试邮件,查看Postfix日志(
/var/log/mail.log或/var/log/maillog)确认milter没有被调用。
备注:内容来源于stack exchange,提问作者SUNITA GUPTA
相关产品推荐
相关产品推荐

