为什么在向用户发送邮件时,postfix会向本地假脱机文件发送退信通知?

我的postfixconfiguration允许邮件通过几个local_recipient_maps。 但是,明确禁用传递到“proxy:unix:passwd.byname”。 这通常会阻止交付给本地的Unix用户:

$ getent passwd | grep www-data www-data:x:33:33:www-data:/var/www:/bin/sh $ nc localhost 25 220 my.mail.host ESMTP Postfix helo localhost 250 my.mail.host mail from:[email protected] 250 2.1.0 Ok rcpt to:[email protected] 550 5.1.1 <[email protected]>: Recipient address rejected: User unknown in local recipient table rcpt to:www-data 550 5.1.1 <www-data>: Recipient address rejected: User unknown in local recipient table 

但是今天早上,我注意到一个电子邮件发送到本地www-数据邮件假脱机文件。 看在内,我看到:

  • 这是来自 [email protected]的一条消息,由我们networking内的其他主机发送,使用my.mail.host作为智能主机
  • 在尝试重试时,它保持在my.mail.host队列中好几天
  • 然后它反弹
  • 反弹被发送到my.mail.host上的“www-data”邮件缓冲文件

所以我的问题是: 为什么会发生这种情况,以后如何防止这种情况发生呢?

假设

你说

传送到“proxy:unix:passwd.byname”被禁止。 这通常阻止交付给本地Unix用户。

所以,我可能会认为你从local_recipient_maps删除了proxy:unix:passwd.byname部分。 默认情况下,这个参数的值是

 # postconf -d local_recipient_maps local_recipient_maps = proxy:unix:passwd.byname $alias_maps 

而你改变它

 # postconf local_recipient_maps local_recipient_maps = $alias_maps 

分析

那么为什么它拒绝正常邮件,但反弹邮件仍然通过?

为了回答这个问题,我们需要看到Postfix架构概览的全貌,特别是当postfix收到邮件时

  trivial- rewrite(8) Network -> smtpd(8) | ^ \ v | Network -> qmqpd(8) -> cleanup(8) -> incoming / pickup(8) <- maildrop ^ | Local -> sendmail(1) -> postdrop(1) 

当Postfix检查通过smtpd收到的电子邮件时,它只会查询local_recipient_maps 。 为什么? 由于检查是在参数smtpd_reject_unlisted_recipient值为“yes”时执行的,或者您在smtpd _ * _ restrictions中设置了reject_unlisted_recipient (请注意两个参数名称中的单词smtpd)。 有关参数的详细信息,请参阅man postconf 。 此检查默认启用。 这就解释了为什么你的testing邮件被postfix拒绝了。

反弹是后缀架构中的特殊电子邮件。 它由postfix内部生成,通知发送者(非)传送状态报告。 它直接通过postfix进行清理 ,绕过smtpd 。 所以这就是为什么www-data仍然反弹的电子邮件。

您可以使用mailbox_transport_maps将其发送到黑洞并放弃服务,而不是拒绝它。

要做到这一点设置mailbox_transport_maps

 #main.cf mailbox_transport_maps = hash:/etc/postfix/wwwdata-blackhole #/etc/postfix/wwwdata-blackhole www-data discard:silently 

现在,每当www数据收到一封电子邮件时,它都会默默丢弃。