【问题标题】:Handling blank lines in email headers处理电子邮件标题中的空行
【发布时间】:2014-08-18 10:55:06
【问题描述】:

遇到一些不符合 RFC 的邮件

authentication-results: spf=none (sender IP is ) smtp.mailfrom=**@********.**;

Content-Type: multipart/related;
    boundary="_004_2039b206f2a54788ba6a101978bd3f82DBXPR07MB013eurprd07pro_";
    type="multipart/alternative"
MIME-Version: 1.0

例如,上面的邮件在标题中有一个空行(在 Content-Type 之前)。严格遵守 RFC(例如 https://github.com/mikel/mail)的库将无法解析它们。 Apple Mail、Thunderbird 确​​实能够处理此类邮件。

曾尝试浏览 Thunderbird 的代码库,对 C++ 不熟悉,才找到https://github.com/mozilla/releases-comm-central/blob/1f2a40ec2adb448043de0ae96d93b44a9bfefcd1/mailnews/mime/src/mimemsg.cpp

谁能指出 Thunderbird 代码库中邮件解析发生的部分,或者任何处理此类非投诉邮件的开源库/应用程序。

编辑:

空行的十六进制转储。它包含一个空格。

00013e0: 2a2a 2a2a 2a2a 2e2a 2a3b 0d0a 200d 0a43  ******.**;.. ..C
00013f0: 6f6e 7465 6e74 2d54 7970 653a 206d 756c  ontent-Type: mul
0001400: 7469 7061 7274 2f72 656c 6174 6564 3b0d  tipart/related;.

【问题讨论】:

  • 我怀疑 blank 行并不是真正的空白,而是有一个空格——这会使你的问题成为 ruby​​ 实现中的错误,而不是其他实现中的一个特性—— - 你能添加一个八进制/十六进制转储“问题行*
  • @Soren 附加了 hexdump,行中有一个空格
  • 所以 blank 行实际上是前一个标题的延续行——mail 中的 ruby​​ 代码可能是 trims 解析它们之前的行——导致使延续语法失败的代码。
  • @Soren 是的,它是一个空的折叠页眉。 github.com/mikel/mail/commit/… 中引入了不合规行为。该问题已在 github.com/mikel/mail/commit/… 中提出。

标签: c++ email mime thunderbird


【解决方案1】:

引用的ruby library 中的 Ruby 代码未符合 RFC,它允许将多行折叠成一个标题行。规则是连续的标题行(折叠标题)应该以空格开头——确切的细节在 RFC 5322,"Folding White Space and Comments" 部分。

最可能的问题是 Ruby 代码在解析之前读取每一行并修剪空格——因此未能检测到额外的行实际上属于前一个标题——但额外的行并没有添加任何内容到标题(因为它只包含一个空格),但它是有效的语法。

编辑:

在提交17783f8536fc09b926c7425dbacfc35e0e851ef5 中引入了不合规行为。引入的副作用之一是将标题和正文拆分为空的折叠标题

CRLF = /\r\n/
white_space = %Q|\x9\x20|
WSP = /[#{white_space}]/

header_part, body_part = raw_source.split(/#{CRLF}#{WSP}*#{CRLF}(?!#{WSP})/m, 2)

问题在提交 a2a45597bce66ebe788cedaaab848a37bd04b25a 中提出,但共识是不破坏现有行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 2015-12-27
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2010-12-19
    相关资源
    最近更新 更多