如何配置Postfix+Dovecot不提前拒收收件人不存在邮件,交由Milter校验
解决方案
核心逻辑说明
你当前遇到的提前拒收问题,根源是Postfix默认会在SMTP会话的收件人校验阶段,对照virtual_mailbox_maps检查虚拟域收件人是否存在,不存在就直接返回550错误,邮件根本不会流转到Milter环节。我们只需要关闭SMTP阶段的收件人存在性校验,仅保留域名合法性校验避免成为开放中继,即可让所有托管域名的入站邮件都交给Milter处理。
配置修改步骤
1. 调整Postfix main.cf配置
在你现有配置基础上添加/修改以下参数:
# 关闭SMTP阶段对未列出入局收件人的自动拒收逻辑 smtpd_reject_unlisted_recipient = no # 显式指定收件人限制规则,仅拒收非你托管的域名邮件,不校验用户是否存在 smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination # 明确指定Milter使用V2版本协议 milter_protocol = 2 # 可选:Milter服务故障时的默认动作,可按需调整为tempfail/accept/reject milter_default_action = tempfail
注意:不要删除/注释
virtual_mailbox_domains配置项,这是reject_unauth_destination规则生效的基础,可避免你的服务器成为开放中继被滥用。virtual_mailbox_maps也可以保留,供Milter校验通过后的邮件投递阶段查询用户信息使用。
2. 重载Postfix配置
执行命令生效配置:
postfix reload
效果验证
向你托管域名下一个不存在的收件人发送测试邮件,Postfix不会直接返回550错误,而是会将邮件完整转发给你的Milter处理,你可以在Milter中自行校验收件人有效性,无效时按PEC标准生成对应回执即可。
Dovecot侧无需额外调整,你现有的
allow_all_users=yes配置已经可以避免极端情况下LMTP阶段提前拒收的问题。
内容的提问来源于stack exchange,提问作者Riccardo Deserti
相关产品推荐
相关产品推荐

