代码之家  ›  专栏  ›  技术社区  ›  BastiBen

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

  •  6
  • BastiBen  · 技术社区  · 16 年前

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

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

    基本上,这些mime文件类似于原始电子邮件,但没有smtp头。相反,它们以mime头“mime-version:1.0”开头,之后是部分。

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

    • 保持开放(至少是LGPL),而不是适当的
    • 压缩-我只需要解析器,不支持SMTP/POP3
    • 跨平台(针对Windows、Mac OS X和Linux)

    经过数天的搜索,我发现了以下libs和原因 使用它们:

    • mimetic (C++)——虽然这个库看起来是完整的,但是C++的用法是基于 油嘴滑舌的 无法在Windows上正确编译。
    • Vmime (C++)似乎完整,但没有官方窗口支持。他们还提供“双重许可”(“商业LGPL”+GPL)。看起来Ubuntu和Debian都有,但是许可证很混乱。
    • mime++ ---商业,不支持Mac。
    • Chilkat Software MIME C++ Library ——商业化,专注于Windows。

    我真的不想写我自己的mime解析器。哑剧非常流行 必须 做一个开放的库,以理智的方式处理这个文件格式。

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

    事先谢谢!

    5 回复  |  直到 9 年前
        1
  •  6
  •   jstedfast    12 年前

    gmime是用C编写的lgpl mime解析器。它确实依赖于glib,但glib在Windows上可用: 32bit 64bit (以及所有基于Unix的平台,包括Mac OS X)。它还构建在Visual Studio Afait中,因此我看不到问题所在。我知道至少有一个商业Windows供应商在他们的产品(Kerio Connect,IIRC)中提供libgmime.dll和libglib.dll。诺基亚甚至在他们的一些手机上发布。

    如果您真的希望它在“:”上执行除拆分头之外的任何操作,并对内容类型头执行随意的分析,以查找边界字符串,然后继续处理非嵌套的多部分(除了分析HTTP响应和预先屏蔽的MIME消息之外,这有点无用你控制的成分)。

    就代码行而言,像gmime这样的解析器之所以如此“大”,是因为它们适用于那些实际需要正确、健壮的mime部分和头解析/解码的开发人员。看我的咆哮 decoding rfc2047 encoded-word tokens 要了解这有多复杂(顺便说一句,除了gmime和mimekit之外,我还没有找到任何能够处理RANT中讨论的所有边缘情况的开源mime解析器)。

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

    我的观点是,“轻量级”是那些不知道自己在说什么的人的胡说八道的标准。

    基于一些有意义的东西比如RFC遵从性来判断怎么样?或者通过符合RFC和性能的结合?不管怎样,在任何有意义的比较中,gmime都会成为赢家。

        2
  •  4
  •   BastiBen    15 年前

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

    在花了更多的时间之后,我最终编写了自己的实现。实际上,mime非常简单,如果您阅读文档,那么您可以在短时间内完成并运行一些东西。

    但是,我认为应该有类似vmime的东西,但是开源的。我不敢相信只有那么少的人需要处理MIME结构,因为它是一个真正的标准。

        3
  •  3
  •   Mathieu Rodic    11 年前

    我已经成功地使用了 mimetic 我的MSVC2010。 它也在窗户上工作。有麻省理工学院的执照。

        4
  •  0
  •   Michael Chourdakis    9 年前

    我还创建了一个支持S/MIME的MIME库(仅限Windows)。但是,如果您不想使用S/MIME,可以删除特定于Windows的函数。

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

        5
  •  0
  •   spartucus    9 年前

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

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