Content-Id header 的精确格式
The precise format of Content-Id header
消息部分Content-Id
header的格式我真的很困惑
在我看来,只有 RFC 2045 涵盖了 header 的格式,但是很简单:
In constructing a high-level user agent, it may be desirable to allow
one body to make reference to another. Accordingly, bodies may be
labelled using the "Content-ID" header field, which is syntactically
identical to the "Message-ID" header field:
id := "Content-ID" ":" msg-id
Like the Message-ID values, Content-ID values must be generated to be
world-unique.
RFC 2822 像这样解释 msg-id
令牌的格式:
The message identifier (msg-id) is similar in syntax to an angle-addr
construct without the internal CFWS.
message-id = "Message-ID:" msg-id CRLF
in-reply-to = "In-Reply-To:" 1*msg-id CRLF
references = "References:" 1*msg-id CRLF
msg-id = [CFWS] "<" id-left "@" id-right ">" [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
header 一样。但是,几乎所有关于 MIME 格式的 reader-friendly 文章都给出了 Content-Id
没有 at 符号的示例(包括 not-really-global 标识符,例如 myimagecid
或inlineimage001
以及随机生成的不带 at 符号的 UUIDS)。如果有必要,他们肯定会强调“@”符号的重要性,就像他们对待 Message-Id
header 一样,对吧?对吗?
我已经 运行 对 real-world 电子邮件客户端进行了一些测试,看看他们如何使用嵌入式内联图像撰写电子邮件:
- Thunderbird 生成带有 at 符号的标识符。示例:
part1.12345678.12345678@domain.example.com
- Gmail 生成的标识符没有 这样的符号,也没有域部分。示例:
ii_abc1234x0_12345ab12abcdefa
我没有再测试任何电子邮件客户端(如果有人测试过,完成上面的列表就太好了),但这两个已经显示出显着的差异。 Google 不遵守 RFC 标准?它确实看起来很臭,我想知道那是因为我错过了什么,还是因为格式毕竟不是那么重要(在长 运行 中感觉相当令人不安)。我也有兴趣检查有多少流行的电子邮件客户端实际上丢弃了 'at' 符号。
按照规范所说的进行操作,而不是按照某些邮件客户端的操作进行操作。
所以是的,Content-Id
header 应该有一个符合规范规定的值,因此应该有一个 '@' 符号。
电子邮件的世界是一个破烂不堪的地狱,许多不同的邮件客户端和服务器各司其职,不遵守标准。
作为过去 17 年编写邮件软件的人,我可以向您保证,这不是唯一 Google 偏离规范的地方。
消息部分Content-Id
header的格式我真的很困惑
在我看来,只有 RFC 2045 涵盖了 header 的格式,但是很简单:
In constructing a high-level user agent, it may be desirable to allow one body to make reference to another. Accordingly, bodies may be
labelled using the "Content-ID" header field, which is syntactically
identical to the "Message-ID" header field:id := "Content-ID" ":" msg-id
Like the Message-ID values, Content-ID values must be generated to be world-unique.
RFC 2822 像这样解释 msg-id
令牌的格式:
The message identifier (msg-id) is similar in syntax to an angle-addr construct without the internal CFWS.
message-id = "Message-ID:" msg-id CRLF
in-reply-to = "In-Reply-To:" 1*msg-id CRLF
references = "References:" 1*msg-id CRLF
msg-id = [CFWS] "<" id-left "@" id-right ">" [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
header 一样。但是,几乎所有关于 MIME 格式的 reader-friendly 文章都给出了 Content-Id
没有 at 符号的示例(包括 not-really-global 标识符,例如 myimagecid
或inlineimage001
以及随机生成的不带 at 符号的 UUIDS)。如果有必要,他们肯定会强调“@”符号的重要性,就像他们对待 Message-Id
header 一样,对吧?对吗?
我已经 运行 对 real-world 电子邮件客户端进行了一些测试,看看他们如何使用嵌入式内联图像撰写电子邮件:
- Thunderbird 生成带有 at 符号的标识符。示例:
part1.12345678.12345678@domain.example.com
- Gmail 生成的标识符没有 这样的符号,也没有域部分。示例:
ii_abc1234x0_12345ab12abcdefa
我没有再测试任何电子邮件客户端(如果有人测试过,完成上面的列表就太好了),但这两个已经显示出显着的差异。 Google 不遵守 RFC 标准?它确实看起来很臭,我想知道那是因为我错过了什么,还是因为格式毕竟不是那么重要(在长 运行 中感觉相当令人不安)。我也有兴趣检查有多少流行的电子邮件客户端实际上丢弃了 'at' 符号。
按照规范所说的进行操作,而不是按照某些邮件客户端的操作进行操作。
所以是的,Content-Id
header 应该有一个符合规范规定的值,因此应该有一个 '@' 符号。
电子邮件的世界是一个破烂不堪的地狱,许多不同的邮件客户端和服务器各司其职,不遵守标准。
作为过去 17 年编写邮件软件的人,我可以向您保证,这不是唯一 Google 偏离规范的地方。