RFC 5248: SMTP 增强状态代码注册表
ELI5: RFC 3463 定义了原始增强状态代码集,如 `5.1.1`(用户不存在)。但电子邮件在不断发展——DMARC、TLS、新安全策略——每个都需要新的状态代码。RFC 5248 创建了官方 IANA 注册表,用于跟踪所有这些代码,并定义了添加新代码的规则,以便系统保持有序和一致。
为什么存在这个注册表
增强状态码(RFC 3463)使用三部分的 class.subject.detail 格式来精确描述邮件被接受、拒绝或延迟的原因。原始 RFC 定义了一组固定的代码,但新的电子邮件技术不断需要新代码:
- DMARC 失败需要
5.7.25和5.7.26 - Null MX(RFC 7505)需要
5.1.10 - TLS 要求需要
X.7.X安全范围内的代码 - 身份验证扩展需要
X.7.20到X.7.27
没有正式的注册表,新代码可能会被临时分配,存在碰撞风险。RFC 5248 建立了 IANA"简单邮件传输协议(SMTP)增强状态码"注册表,具有明确的注册规则,并要求每个新代码都有明确的含义。
工作原理
该注册表按其三个组成部分组织代码。新代码通过 IETF 标准流程添加,每个条目记录:
注册表条目格式
| 字段 | 说明 |
|---|---|
| 代码 | X.Y.Z 增强状态码 |
| 示例文本 | 条件的人类可读描述 |
| 关联的基本状态码 | 此增强代码可能出现的 SMTP 回复代码 |
| 说明 | 何时使用此代码的详细解释 |
| 参考 | 定义此代码的 RFC 或文档 |
| 提交者 | 请求注册的人 |
| 变更控制人 | 谁可以更新此条目(通常是 IESG) |
带有注册表定义代码的 SMTP 响应
MAIL FROM:<sender@example.com> 250 2.1.0 Originator address accepted RCPT TO:<user@example.org> 550 5.7.26 This message does not pass DMARC evaluation ^^^^^ 在 IANA 注册表中注册,由 RFC 7372 定义 RCPT TO:<nobody@null-mx.example> 556 5.1.10 Recipient address has null MX ^^^^^^ 在 IANA 注册表中注册,由 RFC 7505 定义
关键技术细节
枚举状态码(类别 + 主题)
RFC 5248 定义了"枚举状态码",其中组合了类别和主题值。类别保持为 2、4 或 5,主题值为:
| 主题 | 类别 | 示例代码 |
|---|---|---|
X.0.X |
其他/未定义 |
X.0.0 — 其他未定义状态 |
X.1.X |
寻址 |
5.1.1 邮箱错误、5.1.2 域错误、5.1.10 null MX |
X.2.X |
邮箱 |
4.2.2 邮箱满、5.2.1 邮箱已禁用 |
X.3.X |
邮件系统 |
5.3.4 邮件过大 |
X.4.X |
网络/路由 |
4.4.1 主机无应答、4.4.2 连接错误 |
X.5.X |
邮件投递协议 |
5.5.1 无效命令、5.5.2 语法错误 |
X.6.X |
邮件内容 |
5.6.1 不支持的媒体 |
X.7.X |
安全/策略 |
5.7.1 投递被拒、5.7.26 DMARC 失败 |
自 RFC 3463 以来添加的代码
| 代码 | 含义 | 定义者 |
|---|---|---|
5.7.20 |
未找到通过 DKIM 签名 | RFC 7372 |
5.7.21 |
未找到可接受的 DKIM 签名 | RFC 7372 |
5.7.22 |
未找到有效的作者匹配 DKIM 签名 | RFC 7372 |
5.7.23 |
SPF 验证失败 | RFC 7372 |
5.7.24 |
SPF 验证错误 | RFC 7372 |
5.7.25 |
反向 DNS 验证失败 | RFC 7372 |
5.7.26 |
多个身份验证检查失败(DMARC) | RFC 7372 |
5.7.27 |
发件人地址有 null MX | RFC 7505 |
5.1.10 |
收件人地址有 null MX | RFC 7505 |
注册策略
新代码根据 IANA 策略需要"规范要求"。这意味着必须有已发布的规范(通常是 RFC)来定义代码的语义。指定的专家审查员确保不与现有代码冲突,并且新代码适合在正确的主题类别内。
常见错误
- 硬编码一组固定的状态码。注册表是可扩展的。新代码定期添加。构建您的退信处理器以优雅地处理未知代码,方法是退回到类别(2/4/5)和主题类别。
- 发明未注册的代码。某些邮件服务器返回不在注册表中的自定义增强状态码。虽然在技术上作为私有使用有效,但这会损害互操作性。尽可能使用已注册的代码。
-
处理新代码时忽略类别数字。如果您遇到
5.7.28(假设的未来代码),您可能不知道其具体含义,但您知道它是永久性安全/策略失败。类别和主题始终是有意义的。 -
不区分类别 4 和类别 5。
4.2.2(邮箱满,临时)和5.2.1(邮箱已禁用,永久)有相同的主题,但需要完全不同的处理方式。始终首先检查类别。 - 假设所有服务器都使用增强代码。ENHANCEDSTATUSCODES SMTP 扩展部署广泛但并非普遍。您的退信解析器必须处理仅包含基本三位数代码的响应。
可投递性影响
-
精确的退信分类。该注册表为您提供了一个标准化的词汇表,用于说明邮件失败的原因。
5.7.26表示 DMARC 失败 — 修复您的身份验证。5.1.1表示地址无效 — 从列表中删除。不查询注册表,您只是在猜测。 -
身份验证失败诊断。RFC 7372 添加的
5.7.20–5.7.26代码范围让您准确指出哪个身份验证机制失败:DKIM、SPF、反向 DNS 或 DMARC 对齐。 -
未来证明的退信处理。通过从任何代码(甚至未识别的代码)解析类别和主题,您的系统会在注册新代码时优雅地降级。即使您从未见过
5.7.X代码,它仍然是永久性安全拒绝。 - 与 DSN 报告关联。增强状态码出现在 SMTP 响应和 DSN 报告(RFC 3464)中。该注册表确保同一代码在两种环境中的含义相同,从而实现一致的退信处理。