简介
从 Postfix 2.0 版本开始,Postfix SMTP 服务器会拒绝发送到未知收件人的邮件。这些未知收件人属于 本地域(与 $mydestination 匹配或 $inet_interfaces 或 $proxy_interfaces)的本地域,并显示"本地收件人表中不存在用户"错误。此功能在较早版本的 Postfix 中是可选的。
好消息是,这会将无法投递的邮件从队列中移除,从而避免邮件队列被无法投递的 MAILER-DAEMON 消息堵塞。
坏消息是,当您从未配置为拒绝未知本地收件人邮件的 Postfix 系统升级时,可能会导致邮件被拒绝。
本文档描述了正确拒绝未知本地收件人所需的步骤。
在 main.cf 中配置 local_recipient_maps
local_recipient_maps 参数指定包含所有本地收件人名称或地址的查找表。当收件人的域名与 $mydestination、$inet_interfaces 或 $proxy_interfaces 中。如果本地用户名或地址未在 $local_recipient_maps 中列出,则 Postfix SMTP 服务器将拒绝该地址并返回错误信息 "用户在本地收件人表中不存在"。其他接口(如 Postfix 的 sendmail(1) 命令)仍可能接受"未知"收件人。
默认设置如下,假设您使用 Postfix 的默认本地交付代理 local(8) 进行本地交付,其中收件人要么是 UNIX 账户(通常位于 /etc/passwd),要么是本地别名(通常位于 /etc/aliases):
/etc/postfix/main.cf: local_recipient_maps = proxy:unix:passwd.byname $alias_maps
要禁用 SMTP 服务器对未知本地收件人的拒绝,请指定:
/etc/postfix/main.cf: local_recipient_maps =
即为空值。此设置后,Postfix SMTP 服务器将不会因"本地收件人表中不存在用户"而拒绝邮件。请勿在直接接收互联网邮件的系统上进行此操作。由于当前的蠕虫和病毒,Postfix 将成为反向散射源:它会接受发给不存在收件人的邮件,并尝试将这些邮件以"无法投递"的状态退回给通常被伪造的发件人地址。
当需要修改 main.cf 文件中的 local_recipient_maps 设置时
问题:您未使用 Postfix 的默认 local(8) 交付代理,用于匹配 $mydestination、$inet_interfaces,或 $proxy_interfaces。例如,您在 main.cf 中重新定义了 "local_transport" 设置。
解决方案:您的 local_recipient_maps 设置需要指定一个包含该投递代理所有已知用户名或地址的数据库。例如,如果您通过 virtual(8) 交付代理将用户交付到 $mydestination 等域,请指定:
/etc/postfix/main.cf mydestination = $myhostname localhost.$mydomain localhost ... local_transport = virtual local_recipient_maps = $virtual_mailbox_maps
如果您未使用 local(8) 或 virtual(8) 交付代理来处理 $mydestination 等域,请参阅下文的"本地收件人表格式"部分,了解该表应如何填充。
问题:您使用了 mailbox_transport 或 fallback_transport 功能,用于向非 UNIX 收件人发送邮件。
解决方案:您需要添加列出非UNIX收件人的数据库:
/etc/postfix/main.cf local_recipient_maps = proxy:unix:passwd.byname, $alias_maps, <包含非UNIX收件人的数据库>
请参阅下文"本地收件人表格式"部分,了解该表应如何填充。
问题:您使用了 Postfix 本地投递代理的 luser_relay 功能。
解决方案:您必须完全禁用local_recipient_maps功能,以便Postfix SMTP服务器接受所有本地地址的邮件:
/etc/postfix/main.cf local_recipient_maps =
本地收件人表查询格式
如果 local_recipient_maps 指定了本地文件,例如 postmap(1) 或 postalias(1) 格式,则 Postfix SMTP 服务器将生成以下查询:
- 完整的收件人地址。此查询支持非默认的 local_transport 设置,并可与交付代理(如 lmtp(8) 或 virtual(8))配合使用。请参阅"在 main.cf 中配置 local_recipient_maps"以获取有关应指定哪些查找表的额外指导。
- 收件人地址的本地部分。此查询支持默认的 local_transport 设置,以及与 UNIX 兼容的 local(8) 交付代理;Postfix SMTP 服务器仅在收件人域与 $mydestination 匹配时执行此查询,$inet_interfaces 或 $proxy_interfaces。
- 收件人@domain。此查询支持非默认的 local_transport 设置,并使用交付代理如 virtual(8);它是没有有效收件人列表的域名的通配符。
注意事项:
- 查找表应在地址存在时返回非空结果,并在地址不存在时返回"未找到"。特别地,零长度(空)结果不计为"未找到"结果。
- 当 local_recipient_maps 指定基于 ldap:、memcache:、mongodb:, mysql:, pgsql:, sqlite:, 或其他外部数据库,则 Postfix SMTP 服务器将使用与本节开头描述相同的查询查询该查找表,并期望获得相同的结果。
- 要抑制对 local-part 和 @domain 通配符的查找,请在 Postfix 的 ldap: 中指定 domain 设置,或在 Postfix 的 memcache:、mongodb:、mysql:, pgsql:, sqlite:, 等, 数据库客户端配置文件。
- 当 local_recipient_maps 指定基于 pcre:、regexp: 或 socketmap: 或 tcp:,Postfix 仅使用完整的收件人地址查询该表,而不使用 local-part 或 @domain 通配符。