nis*_*074 5 c++ email mime thunderbird
遇到一些不符合RFC的邮件
authentication-results: spf=none (sender IP is ) smtp.mailfrom=**@********.**;
Content-Type: multipart/related;
boundary="_004_2039b206f2a54788ba6a101978bd3f82DBXPR07MB013eurprd07pro_";
type="multipart/alternative"
MIME-Version: 1.0
Run Code Online (Sandbox Code Playgroud)
例如,上面的邮件的标题(在Content-Type之前)的空白行。严格遵守RFC的库(例如https://github.com/mikel/mail)将无法解析它们。Apple Mail,Thunderbird确实可以处理此类邮件。
试图浏览雷鸟的代码库,不熟悉C ++,我只是设法找到https://github.com/mozilla/releases-comm-central/blob/1f2a40ec2adb448043de0ae96d93b44a9bfefcd1/mailnews/mime/src/mimemsg.cpp
有人可以将我指向雷鸟代码库中进行邮件解析的部分,还是处理此类无投诉邮件的任何开源库/应用程序。
编辑:
空白行的十六进制转储。它包含一个空间。
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;.
Run Code Online (Sandbox Code Playgroud)
引用的ruby 库中的 Ruby 代码不符合 RFC,RFC 允许将多行折叠到单个标题行中。规则是连续标题行(折叠标题)应以空格开头 - 确切的详细信息位于 RFC 5322,“折叠空白和注释”部分。
最可能的问题是 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)
Run Code Online (Sandbox Code Playgroud)
该问题是在提交a2a45597bce66ebe788cedaaab848a37bd04b25a中提出的,但共识是不破坏现有行为。