我的 postfix 配置允许通过多个 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-data 邮件假脱机文件。查看后,我发现:
- 这是一条信息从 [电子邮件保护],由我们网络内的其他主机发送,使用 my.mail.host 作为智能主机
- 尝试重试时,该邮件在 my.mail.host 队列中停留了几天
- 然后它反弹了
- 退回的邮件被发送到 my.mail.host 上的“www-data”邮件假脱机文件
我的问题是:为什么会发生这种情况?我该如何防止它再次发生?
答案1
假设
你说
向“proxy:unix:passwd.byname”的传送被特别禁用。这通常会阻止向本地 unix 用户传送。
因此,我可能假设您从中删除了 proxy:unix:passwd.byname 部分local_recipient_maps
。默认情况下,此参数的值为
# 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 仅local_recipient_maps
在检查通过 收到的电子邮件时进行查询smtpd
。为什么?因为检查是在参数smtpd_reject_unlisted_recipient
值为“yes”或您reject_unlisted_recipient
在 smtpd_*_restrictions 中设置时执行的(请注意两个参数名称中的 smtpd 一词)。请参阅人postconf有关参数的详细信息。此检查默认启用。这解释了为什么您的测试电子邮件被 postfix 拒绝。
弹跳是 Postfix 架构中的特殊电子邮件。它由 Postfix 内部生成,用于向发件人通知(未)送达状态报告。它流通过 postfix 直接进行清理,绕过smtpd
。这就是为什么www-data
仍然会收到退回的电子邮件。
解决方案
为此,请设置 mailbox_transport_maps
#main.cf
mailbox_transport_maps = hash:/etc/postfix/wwwdata-blackhole
#/etc/postfix/wwwdata-blackhole
www-data discard:silently
现在,每当 www-data 收到一封电子邮件,它都会被悄悄丢弃。