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

标签 c++ parsing mime

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

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

基本上,那些 MIME 文件就像原始电子邮件消息一样,但没有 SMTP header 。相反,它们以 MIME-Header“MIME-Version: 1.0”开头,然后是后面的部分。

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

  • 开放(至少 LGPL),而不是属性(property)
  • 紧凑型 - 我只需要解析器,不支持 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 是如此广泛以至于必须有一些开放的库来以理智的方式处理这种文件格式。

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

提前致谢!

最佳答案

GMime 是一个用 C 编写的 LGPL mime 解析器。它确实依赖于 glib,但 glib 在 Windows 上可用:32bit64bit (以及所有基于 Unix 的平台,包括 Mac OS X)。它还在 Visual Studio afaict 中构建,所以我看不出问题是什么。我知道至少有 1 个商业 Windows 供应商在他们的产品(Kerio Connect、iirc)中提供 libgmime.dll 和 libglib.dll。诺基亚甚至在他们的一些手机上搭载了它。

如果您实际上希望它做的不仅仅是在“:”上拆分 header ,并且随意解析 Content-Type header 以查找边界字符串,那么实际上就没有“轻量级”mime 解析器这样的东西然后继续处理非嵌套的多部分(在解析 http 响应和您控制其组成的预制 mime 消息之外有点无用)。

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

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

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

如何根据一些有意义的东西来判断,比如 rfc 合规性?或者通过 rfc 合规性和性能的结合?无论哪种方式,GMime 都会在您进行的任何有意义的比较中胜出。

关于c++ - 从 C/C++ 解析简单的 MIME 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3038074/

相关文章:

c++ - 像 glColorPointer 这样的 OpenGL API 如何知道作为指针传递的数组的大小?

javascript - 如何解析数据和二进制 websocket 消息?

php - 发送 PEAR Mail_Mime 电子邮件时,邮件 html 中的点(.) 缺失

php - 如何摆脱 PHP 的 imap_fetchstructure() 的错误消息?

c++ - 评估 cout 是否具有 constexpr 值?

c++ - 为什么当我试图返回引用时我的对象仍然被复制

java - 用 Java 读取、解析然后写入 CSV

php - 如何解析部分 HTML?

http - MantisBT 图片预览大小设置

C++获取其他用户的appdata路径