← RFC Reference

理解电子邮件退信

Email Concepts Encyclopedia Published March 2026
ELI5: 退信就像实物信件上的"退回发件人"邮戳。**硬退信**意味着地址不存在——这是永久性的。**软退信**意味着邮箱已满或服务器忙碌——这是暂时性的。邮局会发回一份表单(DSN),准确说明发生了什么,并附带一个代码,如"5.1.1",表示"没有这样的邮箱"。你的工作是读取这些代码,停止向死地址发送邮件,并重试暂时性的退信。

硬退信、软退信、DSN格式、增强状态码——以及如何以程序方式处理它们而不损害您的发件人声誉。

退信发生的两种方式

电子邮件传递可能在两个不同的点失败,每个机制都不同:

同步拒绝(在SMTP会话期间)

接收服务器在SMTP对话期间实时拒绝该消息。您会立即获得SMTP响应代码形式的错误:

RCPT TO:<nonexistent@example.com>
550 5.1.1 The email account that you tried to reach does not exist.

这是最干净的退信类型。您的发送服务器立即知道传递失败,可以对其采取行动。

异步退信(接受后的DSN)

接收服务器接受消息(在DATA时返回250 OK),但稍后发现它无法传递——邮箱已满、内容过滤拒绝了它或内部中继失败。服务器生成投递状态通知(DSN)并将其发回信封发件人(MAIL FROM地址)。

这就是为什么MAIL FROM地址很重要。它是接收退信通知的地址。对于事务性电子邮件,这通常是一个专用的退信处理地址,例如bounces+tag@yourdomain.com。

硬退信与软退信

硬退信 软退信
SMTP代码 5xx(永久) 4xx(临时)
含义 传递将永远不会成功 传递可能稍后成功
示例 用户未知、域不存在、地址被策略拒绝 邮箱满、服务器繁忙、灰名单、速率限制
操作 立即从列表中删除 带退避重试;在重复失败后抑制

这种区别至关重要。继续发送到硬退信地址会损害您的发件人声誉。邮箱提供商会跟踪您的退信率——如果超过约2%,您的可递送性会全面受损。

增强状态码

现代SMTP服务器使用增强状态码(RFC 3463、RFC 5248中的注册表),提供比基本三位数代码更多的细节。格式为class.subject.detail:

主题类别

主题 类别 描述
X.0.X 其他/未定义 未分类状态的通用分类
X.1.X 寻址 邮箱或地址的问题
X.2.X 邮箱 邮箱状态(满、已禁用等)
X.3.X 邮件系统 目标邮件系统问题
X.4.X 网络/路由 网络或路由故障
X.5.X 邮件传递协议 SMTP协议问题
X.6.X 消息内容 内容或媒体问题
X.7.X 安全/策略 安全或策略违规

您最常看到的状态码

代码 含义 操作
5.1.0 其他地址状态 硬退信——删除
5.1.1 错误的目标邮箱地址 硬退信——邮箱不存在。立即删除。
5.1.2 错误的目标系统地址 硬退信——域本身无效
5.1.3 错误的目标邮箱地址语法 硬退信——格式错误的地址
4.2.1 / 5.2.1 邮箱已禁用 帐户已暂停或停用
4.2.2 / 5.2.2 邮箱满 超出配额。如果是4xx则临时,如果是5xx则永久。
5.2.3 消息太大 减少消息大小或附件
4.4.1 连接超时 稍后重试
4.4.2 连接断开 稍后重试
5.7.1 未授权投递 策略拒绝——消息或发件人被阻止
5.7.26 DMARC失败 修复您的身份验证记录(SPF、DKIM、DMARC)
4.7.1 灰名单/速率限制 延迟后重试

DSN格式:退信消息的样子

当异步生成退信时,它会以RFC 3464定义的结构化消息形式到达,包装在RFC 3462的multipart/report MIME类型中。DSN有三个部分:

Content-Type: multipart/report; report-type=delivery-status;
boundary="boundary42"

--boundary42
Content-Type: text/plain

Your message to bob@example.com could not be delivered.
The recipient's mailbox does not exist.

--boundary42
Content-Type: message/delivery-status

Reporting-MTA: dns; mx1.example.com
Arrival-Date: Tue, 11 Mar 2026 14:00:00 +0000

Final-Recipient: rfc822; bob@example.com
Action: failed
Status: 5.1.1
Diagnostic-Code: smtp; 550 5.1.1 User unknown
Last-Attempt-Date: Tue, 11 Mar 2026 14:00:05 +0000

--boundary42
Content-Type: message/rfc822

[Original message headers included here]

--boundary42--

三个MIME部分:

  1. text/plain ——人类可读的说明
  2. message/delivery-status ——机器可读的结构化数据,包含状态码、收件人和诊断信息
  3. message/rfc822 ——原始消息头(或完整消息),以便您可以识别哪条消息退信

用于程序处理的关键字段:

以编程方式处理退信

使用VERP进行可靠的识别

VERP(可变信封返回路径)将收件人地址编码到MAIL FROM中,因此当退信返回时,您可以准确识别哪个收件人退信,而无需解析DSN正文:

MAIL FROM:<bounces+bob=example.com@yourdomain.com>

当bob@example.com退信时,DSN被投递到bounces+bob=example.com@yourdomain.com。您解析本地部分以提取原始收件人。即使DSN格式不规范或非标准,这也适用。

处理逻辑

可靠的退信处理器遵循此逻辑:

  1. 解析DSN ——提取message/delivery-status部分。读取Status:字段。
  2. 分类退信:
    • 状态以5.开头→硬退信。抑制地址。
    • 状态以4.开头→软退信。增加计数器。
  3. 应用抑制规则:
    • 1个硬退信→立即抑制
    • 在时间窗口内N个软退信(例如7天内3个)→作为硬退信抑制
  4. 通过VERP识别(如果DSN解析失败——许多服务器发送非标准退信)
  5. 记录所有内容 ——记录状态码、诊断、时间戳和原始消息ID以供调试

注意虚假硬退信

某些服务器错误地为临时条件返回5xx(如速率限制)。如果您看到5.7.1且消息关于"连接太多"或"稍后重试",尽管是5xx类别也将其视为软退信。使用诊断文本作为次要信号。

退信率和声誉

邮箱提供商将您的退信率作为列表卫生信号进行监控:

对于事务性电子邮件(密码重置、收据),退信率应远低于1%。事务性邮件的高退信率表明您的应用程序在注册时接受了无效地址。在发送之前添加电子邮件验证。

可能出错的地方

完全忽视退信

最常见的错误。如果您继续发送到硬退信的地址,邮箱提供商将节流,最终阻止您的发送IP。您的可递送性将对所有收件人降低,而不仅仅是无效的收件人。

非标准退信格式

并非所有MTA都生成RFC兼容的DSN。有些发送没有message/delivery-status部分的纯文本退信。其他人仅在人类可读的文本中包含状态码。您的解析器需要优雅地处理这些——这就是VERP作为后备识别方法如此有价值的原因。

反向散射

当服务器接受来自欺骗发件人的消息,然后生成退信时,该退信会转到伪造的MAIL FROM地址。无辜的域所有者会收到针对他们从未发送的邮件的退信消息。这称为反向散射,是一种滥用形式。现代服务器应在SMTP会话期间同步拒绝,而不是接受并稍后退信。

退信循环

如果您的退信处理地址本身退信(由于配置错误),可能会创建循环。SMTP通过要求退信消息(那些具有MAIL FROM:<>的消息)永远不会自己退信来防止无限循环——如果传递失败,它们会被无声地丢弃。

抑制列表管理

一旦抑制地址,您需要一个流程来重新启用它。人们会修复他们的邮箱(清除配额、重新启用帐户)。常见的模式:允许收件人在冷却期后(30-90天)通过成功接收确认电子邮件来重新验证。

关键要点

进一步阅读

Related RFCs