如何在 Postfix 中禁用未送达通知(退回邮件)?
我已经使用 rspamd 3.6 设置了 Postfix 3.8.1。垃圾邮件过滤正在发挥作用
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 以简单地拒绝垃圾邮件?
问题是你的情况没有问题。您的测试使用所谓的本地提交,它通过 Postfix 的
pickup
服务注入到 Postfix 中,换句话说,它完全绕过 SMTP。这是Postfix 架构概述第一个图表中的“本地”路径。这里需要注意的是,因为没有 SMTP 阶段,所以没有地方可以在邮件排队之前实际拒绝邮件。该
sendmail
命令是用户级非特权应用程序。它只是在任何人都可以写入并且(特权)守护进程从中pickup
获取文件的特定位置创建一个文件。创建文件时提交已经发生,除了向用户发送未送达通知之外,没有其他方法可以向用户发出任何问题信号。Milter 技术首先出现在 Sendmail 包中(不要与
sendmail
命令混淆;Sendmail 是一个像 Postfix 一样的完整 MTA,它本身包含自己的 sendmail 命令实现,该命令将名称捐赠给整个包),旨在在活动 SMTP 期间实时过滤邮件session,所以需要一个。它是在会话的每个阶段调用的一组函数(例如,在连接之后、在每个用户命令之后以及在DATA 阶段期间的每个消息块之后),并且它们中的每个都可以随时拒绝消息。对于通过其他方式传入的消息(例如本地提交)Postfix 可以模拟通过以正确的顺序调用这些函数并使用所谓的正确“合成”参数,milter 的 SMTP 会话可以正常工作,但它仍然期望此类 milter 永远不会拒绝邮件,因为没有真正的 SMTP 会话来报告拒绝。如果您的非 SMTP 过滤器尝试拒绝,Postfix 会将其视为配置错误。这是为了对服务器上生成的邮件进行签名,而不是对其进行过滤。请在Milter 自述文件中阅读更多相关信息。您刚刚在 Postfix 中测试了错误的代码路径,而不是传入消息将采用的代码路径。如果您尝试通过 SMTP 传递相同的邮件,milter 将完全有权随时拒绝该邮件,并且会在排队之前拒绝该邮件,因此不会生成未送达通知。