Skip to main content

Appendix B. Differences from Earlier Specifications (与早期规范的差异)

本附录包含自早期规范 (特别是 [RFC0822], [RFC1123]和 [RFC2822]) 以来对互联网消息格式所做的更改列表。标有星号 (*) 的项目是出现在本文档第4节中的项目,因此不能再生成。

从RFC 822和RFC 1123到RFC 2822的更改 (保留在本文档中)

以下是从 [RFC0822] 和 [RFC1123] 到 [RFC2822] 的更改,这些更改在本文档中保留:

  1. phrase中允许句点的废弃形式。*
  2. ABNF移出文档,现在在 [RFC5234] 中。
  3. 允许年份使用四位或更多位数。
  4. 明确规定了头部字段的顺序 (以及缺乏顺序)。
  5. 删除了加密头部字段。
  6. 明确允许并赋予"-0000"时区意义。
  7. 不允许在每个标记之间插入折叠空白。
  8. 删除了对目的地的要求。
  9. 重新定义了转发 (Forwarding) 和重新发送 (Resending)。
  10. 扩展头部字段不再特别指出。
  11. 删除了ASCII 0 (null)。*
  12. 折叠续行不能仅包含空白字符。*
  13. 日期中不允许自由插入注释。*
  14. 不允许非数字时区。*
  15. 不允许两位数年份。*
  16. 解释三位数年份,但不允许生成。*
  17. 不允许地址中的路由。*
  18. local-part和domain内不允许CFWS。*
  19. 不允许地址列表的空成员。*
  20. 不允许字段名和冒号之间的折叠空白。*
  21. 不允许字段名和冒号之间的注释。
  22. 收紧了in-reply-to和references的语法。*
  23. msg-id内不允许CFWS。*
  24. 收紧了resent字段的语义为仅信息性的。
  25. 不允许Resent-Reply-To。*
  26. 不允许字段的多次出现 (除了resent和received)。*
  27. 不允许自由的CR和LF。*
  28. 指定了行长度限制。
  29. 更清楚地指定了Bcc。

从RFC 2822的更改

以下是从 [RFC2822] 的更改:

  1. 修正了各种排版/语法错误并做出了澄清。

  2. 术语更改: 将"standard"更改为"document"或"specification"。

  3. 术语区分: 区分了"header field"和"header section"。

  4. ctext/qtext/dtext/unstructured的更改: 从ctext、qtext、dtext和unstructured中删除了NO-WS-CTL。*

  5. specials讨论移动: 将specials的讨论移至"Atom"部分。将文本移至"Overall message syntax"部分。

  6. 简化CFWS语法: 简化了CFWS语法。

  7. 修正unstructured语法: 修正了unstructured语法。

  8. 日期和时间语法更改: 更改了date和time语法以处理废弃日期语法中的空白。

  9. 域字面值和消息标识符: 从域字面值和消息标识符中删除了quoted-pair。*

  10. 域语法限制: 澄清了其他规范限制domain语法。

  11. 简化Bcc语法: 简化了"Bcc:"和"Resent-Bcc:"语法。

  12. 跟踪信息中的optional-field: 允许optional-field出现在跟踪信息中。

  13. msg-id简化: 从msg-id中删除了no-fold-quote。澄清了语法限制。

  14. Received语法泛化: 泛化了"Received:"语法以修复错误并将定义移出本文档。

  15. obs-qp简化: 简化了obs-qp。修正并简化了obs-utext (现在只出现在废弃语法中)。删除了obs-text和obs-char,添加了obs-body。

  16. 废弃日期语法修正: 修正了废弃日期语法以允许更多 (或更少) 的注释和空白。

  17. 废弃列表语法修正: 修正了所有废弃列表语法 (obs-domain-list、obs-mbox-list、obs-addr-list、obs-phrase-list和新添加的obs-group-list)。

  18. obs-reply-to修正: 修正了obs-reply-to语法。

  19. obs-bcc和obs-resent-bcc修正: 修正了obs-bcc和obs-resent-bcc以允许空列表。

  20. 删除obs-path: 删除了obs-path。

主要变更总结

语法收紧

RFC 822 (1982)
↓ 更宽松的语法
RFC 2822 (2001)
↓ 进一步收紧
RFC 5322 (2008) ← 本规范
↓ 最严格的生成规则

废弃元素 (标有 *)

所有标有 * 的项目都是禁止生成但必须解析的废弃元素:

类别废弃元素原因
字符NULL, 单独的CR/LF兼容性和安全性
空白完全空白的折叠行解析困难
日期2位数年份, 字母时区歧义和不一致
地址路由, 空成员复杂且无用
语法自由的CFWS插入解析困难

简化和澄清

变更类型影响
ABNF独立文档组织更清晰的参考
术语区分概念澄清减少歧义
语法简化实现简化更容易解析
行长度限制明确要求更好的互操作性

兼容性注意事项

向后兼容性

RFC 5322保持向后兼容性通过:

  1. 解析器: 必须接受所有废弃格式
  2. 生成器: 产生的消息可被旧实现理解
  3. 逐步淘汰: 废弃元素仍可解析

向前兼容性

RFC 5322促进向前兼容性通过:

  1. 可选字段: 支持扩展头部字段
  2. 保留语义: 核心字段含义不变
  3. 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项导致某些语法成为废弃。这些更改主要旨在:

  1. 简化语法: 减少解析复杂性
  2. 提高互操作性: 明确要求和限制
  3. 增强安全性: 删除危险特性
  4. 维护兼容性: 通过废弃语法支持旧格式

实现者应仔细审查这些差异,确保既能生成符合当前标准的消息,又能解析符合历史标准的消息。


下一节: Appendix C. Acknowledgements (致谢)

上一节: Appendix A. Example Messages (示例消息)