RFC 3463: 增强邮件系统状态代码
ELI5: 基本 SMTP 给出一个三位数回复代码,例如"550",表示"某事失败了"。但它为什么失败了?地址错误?邮箱满?服务器过载?增强状态代码添加了一个更具体的三部分代码,例如 `5.1.1`(不良目标邮箱),这样你的软件可以区分差异并采取正确的行动。
存在的原因
SMTP 回复代码(RFC 5321)使用三位数字:250 表示成功,550 表示永久失败,421 表示临时问题。但这些代码对于自动处理来说太粗糙了。"550" 可能意味着:
- 邮箱不存在
- 域不存在
- 发件人被策略阻止
- 邮件内容被拒绝
每一种情况都需要发件人做出不同的响应。增强状态代码通过添加结构化的 class.subject.detail 代码来解决这个问题,该代码精确地标识问题。这些代码出现在 SMTP 响应中(通过 ENHANCEDSTATUSCODES 扩展)和 DSN 报告中(RFC 3464)的 Status 字段中。
工作原理
增强状态代码遵循 X.Y.Z 格式,其中每个分量都有明确的含义:
代码结构
| 分量 | 名称 | 含义 |
|---|---|---|
X |
类别 | 成功 (2)、临时失败 (4) 或永久失败 (5) |
Y |
主题 | 问题类别(地址、邮箱、邮件系统、网络、协议、内容、安全) |
Z |
详情 | 该类别内的具体情况 |
SMTP 响应示例
RCPT TO:<user@example.org> 550 5.1.1 The email account that you tried to reach does not exist ^^^^^ | | | +-- 详情 1 = 不良目标邮箱地址 +------ 主题 1 = 地址状态 类别 5 = 永久失败
在 DSN 报告中
Final-Recipient: rfc822;user@example.org Action: failed Status: 5.1.1 Diagnostic-Code: smtp; 550 5.1.1 User unknown
关键技术细节
类别值
| 类别 | 含义 | 发件人操作 |
|---|---|---|
2.X.X |
成功 | 邮件已被接受或投递。无需操作。 |
4.X.X |
持久临时失败 | 稍后重试。情况可能会自行解决。 |
5.X.X |
永久失败 | 停止重试。邮件将永远无法投递到此地址。 |
主题值
| 主题 | 类别 | 示例 |
|---|---|---|
X.0.X |
其他 / 未定义 | 未分类 |
X.1.X |
寻址 | 不良邮箱、不良域、不良发件人 |
X.2.X |
邮箱 | 邮箱满、已禁用、不接受邮件 |
X.3.X |
邮件系统 | 邮件系统满、不接受邮件、无法支持所选功能 |
X.4.X |
网络和路由 | 主机无响应、连接不良、路由错误 |
X.5.X |
邮件投递协议 | 无效命令、协议语法错误 |
X.6.X |
邮件内容 | 不支持的媒体、转换失败 |
X.7.X |
安全 / 策略 | 需要身份验证、发件人被阻止、需要加密 |
电子邮件发件人最常见的代码
| 代码 | 含义 | 操作 |
|---|---|---|
5.1.1 |
不良目标邮箱地址 | 从列表中移除(硬退信) |
5.1.2 |
不良目标系统地址(域) | 从列表中移除 |
5.2.1 |
邮箱已禁用,不接受邮件 | 从列表中移除 |
4.2.2 |
邮箱满 | 稍后重试;多次失败后抑制 |
5.7.1 |
投递未授权,邮件被拒绝 | 检查身份验证和发件人信誉 |
4.7.1 |
临时身份验证失败 | 重试;检查 SPF/DKIM/DMARC 记录 |
5.7.26 |
DMARC 策略违反 | 修复 DMARC 对齐(SPF 或 DKIM 必须通过对齐域) |
5.7.27 |
发件人地址的 MX 为空 | 为发送域添加有效的 MX 或 A 记录 |
4.4.1 |
连接超时 | 重试;检查 DNS 和网络连接 |
5.3.4 |
邮件对系统来说太大 | 减小邮件大小或附件 |
常见错误
-
仅检查 SMTP 回复代码,忽视增强代码。"550" 告诉你是永久性的,但
5.1.1(用户不存在)和5.7.1(策略阻止)需要完全不同的响应。始终解析增强代码。 -
将所有 5.X.X 代码视为"从列表中移除"。代码
5.7.1通常意味着临时策略阻止(垃圾邮件过滤、速率限制),而不是无效地址。盲目地在每次永久失败时移除地址会导致不必要的列表萎缩。 -
忽视类别数字。第一位数字是最重要的。
4.2.2(邮箱满、临时)和5.2.2(邮箱满、永久)需要不同的处理。某些提供商对可解决的配额问题使用 4.X.X,仅在长期满满时才使用 5.X.X。 - 硬编码特定代码。增强状态代码注册表(RFC 5248)是可扩展的。新代码会不断添加。根据类别和主题进行路由决策,并记录完整代码以进行诊断。
-
混淆 SMTP 回复代码和增强状态代码。三位数的 SMTP 代码(550)和增强代码(5.1.1)是分开的。增强代码出现在响应行中 SMTP 代码之后,或在 DSN 的
Status字段中。
可投递性影响
- 退信分类准确性。增强状态代码是自动退信处理的主要输入。正确分类硬退信(移除)与软退信(重试)与策略阻止(调查)直接影响你的发件人信誉和列表质量。
-
声誉感知的重试逻辑。
4.7.1响应(临时身份验证失败)应触发检查你的 SPF/DKIM/DMARC 记录,而不仅仅是盲目重试。4.2.2(邮箱满)是一个完全不同的问题。 -
诊断和调试。当可投递性下降时,退信日志中的增强状态代码会告诉你正在发生什么。
5.7.1响应激增表明信誉问题;5.1.1激增表明列表数据不良。 -
提供商特定行为。Gmail、Microsoft 和 Yahoo 都使用增强状态代码,但可能为相同的情况分配略有不同的代码。使用代码作为指导,并将其与
Diagnostic-Code文本相关联以获得完整上下文。