如何在 Postfix 中禁用未送达通知(退回邮件)?
我已经安装了 Postfix 3.8.1 和 rspamd 3.6。垃圾邮件过滤功能正在运行
admin@host123456:~ $ wget http://spamassassin.apache.org/gtube/gtube.txt -P /tmp
admin@host123456:~ $ sendmail [email protected] < /tmp/gtube.txt
结果是
root@host123456:~ # egrep 4873D80B30 /var/log/mail.log
2023-10-28T21:41:00.297436+02:00 host123456 postfix/pickup[151929]: 4873D80B30: uid=1000 from=<admin>
2023-10-28T21:41:00.301825+02:00 host123456 postfix/cleanup[151958]: 4873D80B30: message-id=<[email protected]>
2023-10-28T21:41:00.352027+02:00 host123456 postfix/cleanup[151958]: 4873D80B30: milter-reject: END-OF-MESSAGE from localhost[127.0.0.1]: 5.7.1 Gtube pattern; from=<[email protected]> to=<[email protected]>
2023-10-28T21:41:00.359127+02:00 host123456 postfix/cleanup[151958]: 4873D80B30: to=<[email protected]>, relay=none, delay=0.07, delays=0.07/0/0/0, dsn=5.7.1, status=bounced (Gtube pattern)
2023-10-28T21:41:00.365073+02:00 host123456 postfix/bounce[151960]: 4873D80B30: sender non-delivery notification: 58B2E81258
从最后一条日志行可以看出,postfix 向原始发件人(在本例中为 admin@host123456)发回了未送达通知。如何配置 Postfix 以简单地拒绝垃圾邮件?
答案1
问题是你的情况没有问题。你的测试使用了所谓的当地的提交,通过其服务注入 Postfix pickup
,换句话说,它完全绕过了 SMTP。它是第一个图上的“本地”路径Postfix 架构概述。
需要注意的是,由于没有 SMTP 阶段,因此在将邮件排队之前无法真正拒绝该邮件。此sendmail
命令是用户级非特权应用程序。它只是在特定位置创建一个文件,任何人都可以写入该文件,并且(特权)pickup
守护进程可以从该文件中获取该文件。创建文件时,提交已经发生,除了向用户发送未送达通知外,没有其他方法可以向用户发出任何问题的信号。
Milter 技术最早出现在 Sendmail 软件包中(不要与sendmail
命令混淆;Sendmail 是一个像 Postfix 一样的完整 MTA,并且它本身包含自己的 sendmail 命令实现,并将名称捐赠给了整个软件包),旨在实时过滤邮件在活动 SMTP 会话期间, 所以需要一个。它是会话每个阶段调用的一组函数(例如,连接后、每个用户命令后以及 DATA 阶段的每个消息块后),每个函数都可以随时拒绝一条消息。对于通过其他方式(如本地提交)传入的消息,Postfix 可以模拟通过以正确的顺序和正确的“合成”参数调用这些函数,使邮件过滤器正常工作,但它仍然期望这样的邮件过滤器永远不会拒绝邮件,因为没有真正的 SMTP 会话来报告拒绝。如果您的非 SMTP 邮件过滤器试图拒绝,Postfix 会将此视为配置错误。这是为了签署服务器上生成的邮件,而不是过滤它。有关此内容的更多信息,请参阅米尔特自述文件。
您只是在 Postfix 中测试了错误的代码路径,而不是传入邮件将采用的代码路径。如果您尝试通过 SMTP 传递同一封邮件,milter 完全有权随时拒绝该邮件,并且它会在排队之前拒绝它,因此不会生成未送达通知。