从C / C ++中解析简单的MIME文件?

时间:2010-06-14 14:31:25

标签: c++ parsing mime

我已经在网上搜索了几天,但我似乎无法找到解决问题的好方法:

对于我的一个项目,我正在寻找一个好的(轻量级)MIME解析器。我的客户提供MIME格式的文件(线性,无层次结构),其中包含3-4个“部分”。应用程序必须能够拆分这些部分并独立处理它们。

基本上,这些MIME文件就像原始电子邮件,但没有SMTP标头。相反,它们以MIME-Header“MIME-Version:1.0”开头,然后是部分。

我正在使用C ++作为应用程序,因此欢迎使用C ++库。我们也欢迎标准的C库;但它应符合以下标准:

  • 开放(至少是LGPL),而不是properiaty
  • 紧凑 - 我只需要解析器,没有SMTP / POP3支持
  • 跨平台(针对Windows,Mac OS X和Linux)

经过几天的搜索,我找到了以下的库和使用它们的原因:

  • mimetic (C ++)---虽然这个库看起来很完整,而且对于C ++的用法,它基于 glib ,它无法正常编译在Windows上。
  • Vmime (C ++)---似乎已完成,但没有正式的Windows支持。他们还提供“双重许可”(“商业LGPL”+ GPL)。似乎包含在Ubuntu和Debian中,但许可证令人困惑。
  • mime++ ---商业,没有Mac支持。
  • Chilkat Software MIME C++ Library ---商业化,专注于Windows。

我真的不想编写自己的MIME解析器。 MIME非常普遍,必须是一个开放的库,以便以理智的方式处理这种文件格式。

那么,你们有什么想法,建议或链接吗?

提前致谢!

5 个答案:

答案 0 :(得分:6)

GMime是一个用C编写的LGPL mime解析器。它确实依赖于glib,但是glib可以在Windows上使用:32bit64bit(以及所有基于Unix的平台,包括Mac OS X) 。它也构建在Visual Studio内部,因此我无法看到问题所在。我知道至少有一家商业Windows供应商在他们的产品(Kerio Connect,iirc)中发布了libgmime.dll和libglib.dll。诺基亚甚至将它放在他们的一些手机上。

如果你真的希望它除了在':'上分割标题之外做任何事情并且并且对Content-Type标题进行随意解析以寻找边界字符串,那么实际上没有“轻量级”mime解析器这样的东西。然后继续处理非嵌套的多部分(在解析http响应和预先控制组合的预制mime消息之外有点无用。)

就代码行而言,像GMime这样的解析器是如此“大”的原因是因为它们适用于实际需要正确且强大的mime-part和头解析/解码的开发人员。看看我对decoding rfc2047 encoded-word tokens的咆哮,想知道它有多复杂(顺便说一句,除了GMime和MimeKit,我还没有找到任何能够处理我咆哮中讨论的所有边缘情况的开源mime解析器)

即使拥有所有这些额外的强大处理,它仍然仍然比大多数“轻量级”mime解析器更快或更快,特别是考虑到大多数使用readline方法。我见过“轻量级”mime解析器声称在2-3秒内解析25MB的电子邮件文件,并认为这是“快”。我的单元测试GMime解析2个mbox文件,其中包含大于1.2GB(是的,千兆字节)的消息,时间比此短。

我的观点是,“轻量级”是那些不知道他们在谈论什么的人的废话标准。

如何根据rfc合规性等有意义的事情来判断?或者通过rfc合规性和性能的组合?无论哪种方式,GMime都会在你做出的任何有意义的比较中成为赢家。

答案 1 :(得分:4)

已经有一段时间了。所以我只想回答我自己的问题。

在花了一些时间之后,我最终编写了自己的实现。 MIME确实非常简单,如果您阅读文档,您可以在短时间内完成并运行。

但是,我认为应该有类似vMime的东西,但是开源。我无法相信很少有人必须处理MIME结构,因为它是一个真正的标准。

答案 2 :(得分:3)

我已成功将mimetic用于我的MSVC2010。 它也在Windows上工作。并拥有MIT许可证。

答案 3 :(得分:0)

我还创建了一个支持s / mime的mime库(仅限windows)。但是如果你不想要S / Mime的东西,你可以删除Windows特定的功能。

http://www.codeproject.com/Articles/1114232/Cplusplus-MIME-A-simple-single-header-parser-an

答案 4 :(得分:0)

我建议mimecpp,一个MIME的C ++实现。

它非常小巧,封装良好且易于使用。实际上,源代码只包含7个文件。