我正在评估Elixir / Erlang项目的电子邮件解析库,并试图找出哪个是“最佳”的,或者我是否应该构建自己的。我使用的“最佳”标准是:哪个库最符合RFC。
我面临的问题是(不出所料)每个库都有其自己的测试,因此,如果我想比较每个苹果,则需要针对相同的测试运行它们。
是否有可用于评估的测试电子邮件集合?还是我最好从更活跃的Java / Ruby / Python库中复制测试?
答案 0 :(得分:1)
我认为您不会在Elixir中找到任何完整的用于电子邮件解析的测试套件,但这将是一个非常不错的项目。
如果我要开始一个这样的项目,我可能会选择任何库的测试,评估其完成程度(基于RFC),并构建一种通用方法来针对任何库运行它。
DockYard/elixir-mail/blob/master/test/mail/parsers/rfc_2822_test.exs对于您来说可能是一个很好的起点。
答案 1 :(得分:1)
我有一个用于测试mime解析器的mbox。
https://github.com/jstedfast/MimeKit/tree/master/UnitTests/TestData/mbox
该链接是一个目录,其中包含一些*.mbox.txt
文件及其等效的摘要文件(这只是有关每条消息的一些元数据,一旦解析器从mbox解析出该消息,就应该易于从该消息中获取)
还有一些*.html
文件,它们只是提取的html消息正文,用于测试确定哪个正文部分是实际消息正文的逻辑。您可能会忽略这一点,因为这与rfc遵从性无关。
要查看和使用的主要mbox是jwz.mbox.txt
文件-这是我从Netscape Mail的Jamie Zawinski那里获得的mbox文件,它早在2000年代就用于测试Netscape Mail的解析器。
simple.mbox.txt
是一个非常短的mbox,其中包含3条消息,其中包含使用不同边界标记集的嵌套多部分。第二和第三条消息是最有可能破坏解析器的消息(第一个和第二条消息可能破坏由新手在sourceforge或github上编写的随机mime解析器,但没有认真写的内容)。第二条消息使用boundary="x"
具有所有嵌套的多部分,这将破坏不使用边界堆栈的解析器。第三则消息包含嵌套的多个部分,这些部分全部使用空字符串边界(例如boundary=""
)。
然后有一个content-length.mbox.txt
用于测试解析器是否正确处理了Content-Length标头。
unmunged.mbox.txt
看起来像是意外提交的-看起来就像我写的那样,以测试Thunderbird对Content-Length标头和无用的From行做了什么?
无论如何,要查看我如何生成摘要文件的输出,可以签出https://github.com/jstedfast/MimeKit/blob/master/UnitTests/MimeParserTests.cs#L624
文件中列出了DumpMimeTree之类的方法。
我的C MIME解析器也有一个非常相似的测试套件(如果您想读C而不是C#):https://github.com/jstedfast/gmime/blob/master/tests/test-parser.c
其他想法:
评估MIME解析器时要记住的一件事是,您在解析时实际上并不需要严格的rfc-compliance,因为这意味着很多消息将无法解析。您真正想要的是一个库,它将处理尽可能多的损坏,同时输出严格符合rfcs的新消息(无论如何都要尽可能多)。
尽管这些mbox文件有助于确保您测试的解析器至少足够健壮以处理这些解析器,但这不一定是测试的全部。
在评估MIME解析器时,我要做的下一件事是检查解析器如何解析地址标头。它会做一些愚蠢的事情,例如在,
上拆分标题值吗?如果是这样,那就出来了。我可能会说最好使用令牌生成器方法,或者甚至不值得考虑。
rfc2047解码也是如此。
这是我在2013年写信给我的时候,当时我正在寻找适合C#/。NET的相当不错的MIME解析器:https://jeffreystedfast.blogspot.com/2013/09/time-for-rant-on-mime-parsers.html
这可以链接到我之前写的一篇文章,这是关于为什么难以正确解码标头(rfc2047)的言论:https://jeffreystedfast.blogspot.com/2013/08/why-decoding-rfc2047-encoded-headers-is.html
我猜想尝试评估MIME解析器/电子邮件库的问题是,您需要非常熟悉规范,以便对尝试评估它们有更大的信心,而不仅仅是简单的“可以解析我的随机变量?一组消息?”
我希望这会有所帮助,但是...是的,如果您的经历像我在2013年时正在寻找一款体面的C#解析器,那么您将需要编写自己的-请,请,请仔细阅读并遵守相关规范,因为否则您最终将给其他电子邮件开发人员带来噩梦。