理解电子邮件退信
硬退信、软退信、DSN格式、增强状态码——以及如何以程序方式处理它们而不损害您的发件人声誉。
退信发生的两种方式
电子邮件传递可能在两个不同的点失败,每个机制都不同:
同步拒绝(在SMTP会话期间)
接收服务器在SMTP对话期间实时拒绝该消息。您会立即获得SMTP响应代码形式的错误:
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:
- 类别: 2 = 成功,4 = 临时失败,5 = 永久失败
- 主题: 问题的类别
- 细节: 具体问题
主题类别
| 主题 | 类别 | 描述 |
|---|---|---|
| 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有三个部分:
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部分:
- text/plain ——人类可读的说明
- message/delivery-status ——机器可读的结构化数据,包含状态码、收件人和诊断信息
- message/rfc822 ——原始消息头(或完整消息),以便您可以识别哪条消息退信
用于程序处理的关键字段:
- Final-Recipient: 失败的地址
-
Action:
failed(永久)、delayed(临时)、delivered、relayed或expanded -
Status: 增强状态码(例如
5.1.1) - Diagnostic-Code: 原始SMTP响应
以编程方式处理退信
使用VERP进行可靠的识别
VERP(可变信封返回路径)将收件人地址编码到MAIL FROM中,因此当退信返回时,您可以准确识别哪个收件人退信,而无需解析DSN正文:
当bob@example.com退信时,DSN被投递到bounces+bob=example.com@yourdomain.com。您解析本地部分以提取原始收件人。即使DSN格式不规范或非标准,这也适用。
处理逻辑
可靠的退信处理器遵循此逻辑:
-
解析DSN ——提取
message/delivery-status部分。读取Status:字段。 -
分类退信:
- 状态以
5.开头→硬退信。抑制地址。 - 状态以
4.开头→软退信。增加计数器。
- 状态以
-
应用抑制规则:
- 1个硬退信→立即抑制
- 在时间窗口内N个软退信(例如7天内3个)→作为硬退信抑制
- 通过VERP识别(如果DSN解析失败——许多服务器发送非标准退信)
- 记录所有内容 ——记录状态码、诊断、时间戳和原始消息ID以供调试
注意虚假硬退信
某些服务器错误地为临时条件返回5xx(如速率限制)。如果您看到5.7.1且消息关于"连接太多"或"稍后重试",尽管是5xx类别也将其视为软退信。使用诊断文本作为次要信号。
退信率和声誉
邮箱提供商将您的退信率作为列表卫生信号进行监控:
- < 2% 退信率——可接受
- 2-5% ——警告区。您会看到节流和增加的垃圾邮件文件夹放置。
- > 5% ——您的IP和域名声誉正在积极降低。某些提供商将阻止您。
对于事务性电子邮件(密码重置、收据),退信率应远低于1%。事务性邮件的高退信率表明您的应用程序在注册时接受了无效地址。在发送之前添加电子邮件验证。
可能出错的地方
完全忽视退信
最常见的错误。如果您继续发送到硬退信的地址,邮箱提供商将节流,最终阻止您的发送IP。您的可递送性将对所有收件人降低,而不仅仅是无效的收件人。
非标准退信格式
并非所有MTA都生成RFC兼容的DSN。有些发送没有message/delivery-status部分的纯文本退信。其他人仅在人类可读的文本中包含状态码。您的解析器需要优雅地处理这些——这就是VERP作为后备识别方法如此有价值的原因。
反向散射
当服务器接受来自欺骗发件人的消息,然后生成退信时,该退信会转到伪造的MAIL FROM地址。无辜的域所有者会收到针对他们从未发送的邮件的退信消息。这称为反向散射,是一种滥用形式。现代服务器应在SMTP会话期间同步拒绝,而不是接受并稍后退信。
退信循环
如果您的退信处理地址本身退信(由于配置错误),可能会创建循环。SMTP通过要求退信消息(那些具有MAIL FROM:<>的消息)永远不会自己退信来防止无限循环——如果传递失败,它们会被无声地丢弃。
抑制列表管理
一旦抑制地址,您需要一个流程来重新启用它。人们会修复他们的邮箱(清除配额、重新启用帐户)。常见的模式:允许收件人在冷却期后(30-90天)通过成功接收确认电子邮件来重新验证。
关键要点
- 硬退信(5xx)是永久的——立即停止发送。软退信(4xx)是临时的——带退避重试。
- 增强状态码(
X.Y.Z)告诉您具体原因。学习常见的。 - DSN有一个结构化的
message/delivery-status部分用于机器解析。使用它。 - VERP将收件人编码在返回路径中,以实现可靠的退信识别。
- 将您的退信率保持在2%以下。对于事务性电子邮件,在1%以下。
- 在收集时验证电子邮件地址,在您发送之前。