Appendix B. Differences from Earlier Specifications (与早期规范的差异)
本附录包含自早期规范 (特别是 [RFC0822], [RFC1123]和 [RFC2822]) 以来对互联网消息格式所做的更改列表。标有星号 (*) 的项目是出现在本文档第4节中的项目,因此不能再生成。
从RFC 822和RFC 1123到RFC 2822的更改 (保留在本文档中)
以下是从 [RFC0822] 和 [RFC1123] 到 [RFC2822] 的更改,这些更改在本文档中保留:
- phrase中允许句点的废弃形式。*
- ABNF移出文档,现在在 [RFC5234] 中。
- 允许年份使用四位或更多位数。
- 明确规定了头部字段的顺序 (以及缺乏顺序)。
- 删除了加密头部字段。
- 明确允许并赋予"-0000"时区意义。
- 不允许在每个标记之间插入折叠空白。
- 删除了对目的地的要求。
- 重新定义了转发 (Forwarding) 和重新发送 (Resending)。
- 扩展头部字段不再特别指出。
- 删除了ASCII 0 (null)。*
- 折叠续行不能仅包含空白字符。*
- 日期中不允许自由插入注释。*
- 不允许非数字时区。*
- 不允许两位数年份。*
- 解释三位数年份,但不允许生成。*
- 不允许地址中的路由。*
- local-part和domain内不允许CFWS。*
- 不允许地址列表的空成员。*
- 不允许字段名和冒号之间的折叠空白。*
- 不允许字段名和冒号之间的注释。
- 收紧了in-reply-to和references的语法。*
- msg-id内不允许CFWS。*
- 收紧了resent字段的语义为仅信息性的。
- 不允许Resent-Reply-To。*
- 不允许字段的多次出现 (除了resent和received)。*
- 不允许自由的CR和LF。*
- 指定了行长度限制。
- 更清楚地指定了Bcc。
从RFC 2822的更改
以下是从 [RFC2822] 的更改:
-
修正了各种排版/语法错误并做出了澄清。
-
术语更改: 将"standard"更改为"document"或"specification"。
-
术语区分: 区分了"header field"和"header section"。
-
ctext/qtext/dtext/unstructured的更改: 从ctext、qtext、dtext和unstructured中删除了NO-WS-CTL。*
-
specials讨论移动: 将specials的讨论移至"Atom"部分。将文本移至"Overall message syntax"部分。
-
简化CFWS语法: 简化了CFWS语法。
-
修正unstructured语法: 修正了unstructured语法。
-
日期和时间语法更改: 更改了date和time语法以处理废弃日期语法中的空白。
-
域字面值和消息标识符: 从域字面值和消息标识符中删除了quoted-pair。*
-
域语法限制: 澄清了其他规范限制domain语法。
-
简化Bcc语法: 简化了"Bcc:"和"Resent-Bcc:"语法。
-
跟踪信息中的optional-field: 允许optional-field出现在跟踪信息中。
-
msg-id简化: 从msg-id中删除了no-fold-quote。澄清了语法限制。
-
Received语法泛化: 泛化了"Received:"语法以修复错误并将定义移出本文档。
-
obs-qp简化: 简化了obs-qp。修正并简化了obs-utext (现在只出现在废弃语法中)。删除了obs-text和obs-char,添加了obs-body。
-
废弃日期语法修正: 修正了废弃日期语法以允许更多 (或更少) 的注释和空白。
-
废弃列表语法修正: 修正了所有废弃列表语法 (obs-domain-list、obs-mbox-list、obs-addr-list、obs-phrase-list和新添加的obs-group-list)。
-
obs-reply-to修正: 修正了obs-reply-to语法。
-
obs-bcc和obs-resent-bcc修正: 修正了obs-bcc和obs-resent-bcc以允许空列表。
-
删除obs-path: 删除了obs-path。
主要变更总结
语法收紧
RFC 822 (1982)
↓ 更宽松的语法
RFC 2822 (2001)
↓ 进一步收紧
RFC 5322 (2008) ← 本规范
↓ 最严格的生成规则
废弃元素 (标有 *)
所有标有 * 的项目都是禁止生成但必须解析的废弃元素:
| 类别 | 废弃元素 | 原因 |
|---|---|---|
| 字符 | NULL, 单独的CR/LF | 兼容性和安全性 |
| 空白 | 完全空白的折叠行 | 解析困难 |
| 日期 | 2位数年份, 字母时区 | 歧义和不一致 |
| 地址 | 路由, 空成员 | 复杂且无用 |
| 语法 | 自由的CFWS插入 | 解析困难 |
简化和澄清
| 变更 | 类型 | 影响 |
|---|---|---|
| ABNF独立 | 文档组织 | 更清晰的参考 |
| 术语区分 | 概念澄清 | 减少歧义 |
| 语法简化 | 实现简化 | 更容易解析 |
| 行长度限制 | 明确要求 | 更好的互操作性 |
兼容性注意事项
向后兼容性
RFC 5322保持向后兼容性通过:
- 解析器: 必须接受所有废弃格式
- 生成器: 产生的消息可被旧实现理解
- 逐步淘汰: 废弃元素仍可解析
向前兼容性
RFC 5322促进向前兼容性通过:
- 可选字段: 支持扩展头部字段
- 保留语义: 核心字段含义不变
- MIME集成: 与MIME标准协调
实现影响
对生成器的影响
实现RFC 5322的消息生成器必须:
- ✅ 不生成任何带 * 标记的元素
- ✅ 使用严格的语法 (第3节)
- ✅ 遵守行长度限制
- ✅ 正确处理字符编码
对解析器的影响
实现RFC 5322的消息解析器必须:
- ✅ 接受所有废弃格式 (第4节)
- ✅ 鲁棒处理格式错误
- ✅ 正确展开折叠
- ✅ 处理各种地址格式
迁移指南
从RFC 822升级
RFC 822实现
↓
1. 添加4位数年份支持
2. 实现废弃语法解析
3. 收紧生成语法
4. 更新ABNF参考
↓
RFC 5322兼容
从RFC 2822升级
RFC 2822实现
↓
1. 更新ABNF引用 (RFC 5234)
2. 调整ctext/qtext/dtext
3. 修正obs-语法处理
4. 更新文档术语
↓
RFC 5322兼容
测试检查清单
生成测试
测试生成器不产生以下废弃元素:
- NULL字符
- 单独的CR或LF
- 完全空白的折叠行
- 2位数年份
- 字母时区 (如EST, PST)
- 地址路由
- 地址列表中的空成员
- 字段名后的空白
- 过度的CFWS插入
解析测试
测试解析器能够处理:
- 所有废弃日期格式
- 所有废弃地址格式
- 各种折叠模式
- 注释的各种位置
- 边界情况和格式错误
总结
RFC 5322相对于其前身进行了29项更改,其中20项导致某些语法成为废弃。这些更改主要旨在:
- 简化语法: 减少解析复杂性
- 提高互操作性: 明确要求和限制
- 增强安全性: 删除危险特性
- 维护兼容性: 通过废弃语法支持旧格式
实现者应仔细审查这些差异,确保既能生成符合当前标准的消息,又能解析符合历史标准的消息。