跳转到主要内容

于 2025年04月22日 摘录自 Postfix DSN Support

简介

Postfix 2.3 版本引入了对交付状态通知(DSN)的支持,具体描述见 RFC 3464。这使发件人能够控制成功和失败的交付通知。

具体来说,DSN 支持使电子邮件发送者能够指定:

  • 发送哪些通知:成功、失败、延迟或不发送。通常,Postfix 仅在邮件投递延迟或投递失败时通知发送者。
  • 在失败时返回的内容:仅消息头部,或完整消息。
  • 作为投递状态通知的一部分返回的信封 ID。此 ID 标识消息的 提交 交易,切勿与标识消息 内容 的消息 ID 混淆。

DSN 支持的实现涉及向 SMTP MAIL FROM 和 RCPT TO 命令添加额外参数,以及两个 Postfix sendmail 命令行选项,这些选项提供了额外 SMTP 命令参数功能的子集。

本文档包含以下主题的信息:

限制"成功"通知的范围

与无法投递邮件的报告类似,成功投递的 DSN 报告可能会泄露比预期更多的内部基础设施信息。不幸的是,禁止"成功"通知请求会同时禁止其他 DSN 请求。RFC 并未提供协商功能子集的选项。

这听起来没有那么糟糕。当您关闭远程入站邮件的 DSN 时,支持 DSN 的远程发件人仍会收到邮件已成功到达您的 Postfix 网关的通知;他们只是不会收到您内部系统发送的成功投递通知。远程发件人几乎没有损失:他们无法再指定 Postfix 如何报告延迟或失败的投递。

若希望允许受信任客户端发送 DSN 请求但阻止随机陌生人发送,可使用 smtpd_discard_ehlo_keyword_address_maps 功能(见下文如何为所有客户端禁用该功能):

/etc/postfix/main.cf:
smtpd_discard_ehlo_keyword_address_maps = 
cidr:/etc/postfix/esmtp_access
/etc/postfix/esmtp_access:
# 仅允许本地子网的 DSN 请求
192.168.0.0/28 silent-discard
0.0.0.0/0 silent-discard, DSN
::/0 silent-discard, DSN

如果您希望禁止网络中所有 DSN 请求,请使用 smtpd_discard_ehlo_keywords 功能:

/etc/postfix/main.cf:
smtpd_discard_ehlo_keywords = silent-discard, dsn

Postfix sendmail 命令行界面

Postfix 提供了两个与 Sendmail 兼容的命令行选项以支持 DSN。

  • 第一个选项指定通过 Postfix sendmail(1) 命令行提交的邮件应发送哪些通知:

    $ sendmail -N success,delay,failure ... (一个或多个选项)
    $ sendmail -N never ... (或仅此选项)

    内置默认值对应于 "delay,failure"。

  • 第二个选项指定一个信封 ID,该 ID 会在通过 Postfix sendmail(1) 命令行提交的邮件的投递状态通知中报告:

    $ sendmail -V envelope-id ...

    注意:这与旧版本 Postfix 中的 VERP 支持冲突,如下一节所述。

Postfix VERP 支持兼容性

在 Postfix 2.3 之前的版本中,sendmail(1) 命令使用 -V 命令行选项来请求 VERP 风格的投递。为了在 Postfix 2.3 及更高版本中请求 VERP 风格的投递,您必须使用 -XV 而不是 -V。

Postfix 2.3 的 sendmail(1) 命令会检测到您尝试使用 -V 进行 VERP 风格的投递。它会正确处理并提醒您使用新语法。