RFC 3461: SMTP投递状态通知扩展
ELI5: 当您通过邮政服务发送挂号信时,可以请求回执。RFC 3461 是电子邮件的等价物——它允许发送服务器通过在 SMTP 对话中添加特殊参数来说"告诉我这条消息是否已送达、退回或延迟"。
为什么存在这个扩展
基本SMTP(RFC 5321)只能保证你会收到失败通知——如果最终投递失败,接收服务器会生成一条退信。但发件人经常需要更多功能:
- 正面确认消息已投递到收件人的邮箱
- 延迟通知当消息卡在队列中时
- 选择性报告——仅在失败时通知,或仅在成功时通知
- 信封级追踪使用发件人可以关联回原始提交的不透明标识符
没有这个扩展,发件人是盲目的:无回应可能意味着成功投递或消息丢失。RFC 3461添加了SMTP参数,让源MTA明确请求投递状态通知(DSN)并控制其内容。
工作原理
DSN扩展在SMTP EHLO握手期间协商。当接收服务器公告DSN时,发件人可以使用两组新参数:
MAIL FROM参数
-
RET=FULL或RET=HDRS——控制DSN消息是否包含完整的原始消息正文或仅包含标头。对于大消息,建议使用HDRS。 -
ENVID=value——信封标识符(最多100个xtext编码字符),将在任何DSN中返回,允许发件人将通知与原始消息关联起来。
RCPT TO参数
-
NOTIFY=conditions——逗号分隔的列表:SUCCESS、FAILURE、DELAY或特殊值NEVER。这控制何时生成DSN。 -
ORCPT=type;address——原始收件人地址(在任何别名扩展或转发之前),以便DSN可以报告发件人实际想要的地址。
SMTP会话示例
EHLO sender.example.com 250-mail.example.org Hello 250-SIZE 52428800 250-DSN 250 STARTTLS ; 带信封ID请求DSN,退信时仅返回标头 MAIL FROM:<alice@sender.example.com> RET=HDRS ENVID=msg-20260311-0042 250 OK ; 在成功或失败时通知,保留原始收件人 RCPT TO:<bob@example.org> NOTIFY=SUCCESS,FAILURE ORCPT=rfc822;bob@example.org 250 Accepted ; 禁止此收件人的所有DSN RCPT TO:<bcc-copy@archive.example.com> NOTIFY=NEVER 250 Accepted DATA 354 Start mail input [message content] . 250 OK
关键技术细节
NOTIFY值
| 值 | 何时生成DSN |
|---|---|
SUCCESS |
消息成功投递到收件人的邮箱 |
FAILURE |
投递永久失败(硬退信) |
DELAY |
投递延迟但仍在重试 |
NEVER |
在任何情况下都不生成DSN(不能与其他值组合) |
如果省略NOTIFY,默认行为等同于NOTIFY=FAILURE——你只会在永久失败时收到通知。
ENVID编码
ENVID值使用xtext编码:可打印ASCII字符保持不变,但+和=(以及可打印ASCII范围之外的字符)编码为+XX,其中XX是十六进制值。这使参数对SMTP传输安全。
中继行为
支持DSN的中间MTA在中继时必须传播DSN参数。如果中间MTA不支持DSN,它必须仍根据标准SMTP规则生成适当的退信消息,尽管细粒度的DSN控制将丢失。
常见错误
-
将NEVER与其他值组合。
NOTIFY=NEVER,FAILURE是无效的。NEVER必须单独出现。 -
使用DSN参数而不检查EHLO。如果服务器不公告
DSN,包含这些参数将导致语法错误(代码501)。 - 期望来自所有服务器的DSN。DSN支持是可选的。许多大型邮箱提供商不公告它,意味着你无法强制Gmail或Outlook发送成功通知。
- 对大消息使用RET=FULL。这会导致整个原始消息(包括附件)包含在DSN中,可能会触及大小限制或浪费带宽。
- 在转发时忘记ORCPT。如果你的服务器扩展别名或转发邮件,省略ORCPT意味着DSN将报告最终地址,而不是发件人使用的地址。
可投递性影响
DSN支持是专业邮件发送的关键基础设施:
-
退信处理。程序化退信处理依赖DSN来识别哪个收件人失败以及原因。
ENVID参数让你将退信关联回特定的活动或交易。 -
列表卫生。
NOTIFY=FAILURE(默认值)确保你了解无效地址。及时删除退信地址保护你的发件人声誉。 -
抑制不必要的流量。对于不需要投递确认的BCC副本或存档地址使用
NOTIFY=NEVER。 -
延迟感知。
NOTIFY=DELAY在投递问题成为永久失败之前向你发出警报,给你时间进行调查。