【问题标题】:The precise format of Content-Id headerContent-Id 标头的精确格式
【发布时间】:2017-01-27 09:24:36
【问题描述】:

当谈到消息部分中Content-Id 标头的格式时,我真的很困惑。

在我看来,只有RFC 2045 涵盖了标题的格式,但是很简短:

在构建高级用户代理时,可能需要允许 一个机构来参考另一个机构。因此,身体可能是
使用语法上的“Content-ID”标头字段进行标记
与“Message-ID”标头字段相同:

 id := "Content-ID" ":" msg-id

与 Message-ID 值一样,必须生成 Content-ID 值才能 世界独一无二。

RFC 2822 解释了msg-id 令牌的格式,如下所示:

消息标识符 (msg-id) 在语法上类似于角度地址 在没有内部 CFWS 的情况下构建。

message-id = "Message-ID:" msg-id CRLF

in-reply-to = "In-Reply-To:" 1*msg-id CRLF

references = "参考:" 1*msg-id CRLF

msg-id = [CFWS] "" [CFWS]

id-left = dot-atom-text / no-fold-quote / obs-id-left

id-right = dot-atom-text / no-fold-literal / obs-id-right

no-fold-quote = DQUOTE *(qtext/quoted-pair) DQUOTE

no-fold-literal = "[" *(dtext/quoted-pair) "]"

长话短说:它包含 at ('@') 符号,就像消息的 Message-Id 标头一样。然而,几乎所有关于 MIME 格式的易于阅读的文章都给出了 Content-Id 没有 at 符号的示例(包括非真正全局标识符,如 myimagecidinlineimage001 以及随机生成的 UUIDS没有 at 符号)。如果有必要,他们肯定会强调“@”符号的重要性,就像他们对Message-Id 标头所做的那样,对吧?对吧?

我在真实世界的电子邮件客户端上运行了一些测试,看看他们如何使用嵌入的内嵌图像撰写电子邮件:

  • Thunderbird 生成带有 at 符号的标识符。示例:part1.12345678.12345678@domain.example.com
  • Gmail 生成标识符没有这样的符号,也没有域部分。示例:ii_abc1234x0_12345ab12abcdefa

我没有再测试任何电子邮件客户端(如果有人测试过,最好完成上面的列表),但这两个已经显示出显着的差异。谷歌不遵守 RFC 标准?它看起来确实很臭,我想知道那是因为我错过了什么,还是因为格式毕竟不是那么重要(从长远来看,这感觉相当令人不安)。我也有兴趣检查有多少流行的电子邮件客户端实际上丢弃了“at”符号。

【问题讨论】:

  • 已被 RFC 5322 废弃。

标签: email mime


【解决方案1】:

按照规范所说的去做,而不是按照某些邮件客户端的做法。

所以是的,Content-Id 标头应该有一个符合规范规定的值,因此应该有一个“@”符号。

电子邮件的世界是一个破碎的地狱,许多不同的邮件客户端和服务器各自为政,不遵守标准。

作为过去 17 年编写邮件软件的人,我可以向您保证,这不是 Google 唯一偏离规范的地方。

【讨论】:

  • 我在 2013 年 jeffreystedfast.blogspot.com/2013/08/… 对解析地址标头进行了一番咆哮,然后发现一位 Thunderbird 开发人员正在咆哮(比我更有说服力)关于电子邮件的类似问题,您可以在 @987654322 找到@ - 如果您对实现 MIME 解析器甚至电子邮件地址解析器感兴趣,我强烈建议您阅读他的完整系列博客文章。
  • 我发现的其他 GMail 与邮件规范的偏差是他们的 IMAP 实现。例如,几年前他们没有处理为与FETCH 命令一起使用而定义的ALLFASTFULL 别名(也许现在已经修复,我不确定)。 GMail 的 IMAP 服务器实现在遇到具有相同边界的嵌套多部分并返回 BODYSTRUCTURE 时会中断,就像 github.com/jstedfast/MailKit/issues/205 中的示例一样 - 虽然从 IMAP 客户端的角度来看很烦人,但我实际上理解并同情 Google 在这个问题上。
  • 其他示例包括 GMail IMAP 在其 ENVELOPE 响应中的 group 地址表示中的一些奇怪之处,以及它们允许在 IMAP 规范中明确禁止的位置使用 ] 字符这一事实。
  • 如果您正在为 MIME(及相关)技术实现解析器,我给您的建议是:从尽可能接近地实现规范开始。然后做一些真实世界的测试,当你在广泛使用的软件中发现奇怪的东西时,调整你的解析器来处理那些被发现的奇怪东西。您无法设计解析器来处理您不知道存在的互操作性问题,但您可以设计解析器来处理规范。随着您的知识基于现实世界的经验而增长,您将能够调整您的解析器来处理您发现的疯狂。
  • FWIW,这让我开始思考,我记得有一个 RFC 对一些常见的问题提出了一些建议:tools.ietf.org/html/rfc7103 - 你可能会发现这很有用。您可能还会发现我的 MIME 解析器的源代码很有用:github.com/jstedfast/MimeKit
猜你喜欢
  • 2019-02-28
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 2011-07-22
  • 2011-02-02
  • 1970-01-01
相关资源
最近更新 更多