Разбор простых файлов MIME из C / C ++? - PullRequest
7 голосов
/ 14 июня 2010

Я искал в Интернете уже несколько дней, но не могу найти хорошего решения своей проблемы:

Для одного из моих проектов я ищу хороший (легкий) MIME-парсер. Мой клиент предоставляет файлы в формате MIME (линейные, без иерархии), которые содержат 3-4 "части". Приложение должно иметь возможность разбивать эти части и обрабатывать их независимо.

В основном эти файлы MIME похожи на необработанные сообщения электронной почты, но без заголовков SMTP. Вместо этого они начинаются с MIME-заголовка «MIME-Version: 1.0» и после этого следуют части.

Я использую C ++ для приложения, поэтому приветствуется библиотека C ++. Также приветствуется стандартная библиотека C; но оно должно соответствовать следующим критериям:

  • Будьте открыты (по крайней мере, LGPL), а не свойства
  • Compact - мне просто нужен парсер, без поддержки 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 ++ Библиотека --- Коммерческий и ориентированный на Windows.

Я действительно не хочу писать свой собственный анализатор MIME. MIME настолько широко распространен, что должна быть некоторой открытой библиотекой для обработки этого формата файла в здравом уме.

Итак, у вас, ребята, есть идеи, предложения или ссылки?

Заранее спасибо!

Ответы [ 5 ]

6 голосов
/ 15 сентября 2013

GMime - это анализатор пантомимы LGPL, написанный на C. Он зависит от glib, но glib доступен в Windows: 32bit и 64bit (и на всех платформах на основе Unix, включая Mac OS X). Он также строится внутри Visual Studio, так что я не вижу, в чем проблема. Я знаю, что есть по крайней мере 1 коммерческий поставщик Windows, поставляющий libgmime.dll и libglib.dll в их продукте (Kerio Connect, iirc). Nokia даже поставляет его на некоторые из своих телефонов.

На самом деле не существует такого понятия, как «легкий» парсер mime, если вы действительно ожидаете, что он будет делать что-то большее, чем разделение заголовков на «:» и выполнять случайный анализ заголовка Content-Type для поиска строки границы. а затем переходим к обработке не вложенных множественных элементов (что-то вроде бесполезного вне анализа http-ответов и предварительно консервированных сообщений MIME, которые вы контролируете композицию).

Причина, по которой синтаксические анализаторы, такие как GMime, являются настолько «большими» в отношении строк кода, заключается в том, что они предназначены для разработчиков, которые действительно хотят корректного и надежного синтаксического анализа / декодирования mime-частей и заголовков. См. Мой рассказ о декодировании токенов кодированных слов rfc2047 , чтобы узнать, насколько сложным это может быть (кстати, кроме GMime и MimeKit, я еще не нашел ни одного парсера mime с открытым исходным кодом, способного обрабатывать все крайние случаи обсуждались в моей напыщенной речи).

Даже несмотря на всю эту сверхпрочную обработку, все же быстрее или быстрее, чем большинство «легких» парсеров MIME, особенно если учесть, что большинство из них используют подход readline. Я видел «легковесные» парсеры MIME для анализа 25-мегабайтных файлов электронной почты за 2-3 секунды и считаю, что это «быстро». Мои модульные тесты для GMime разбирают 2 mbox-файла, заполненных сообщениями размером более 1,2 ГБ (да, гигабайтами) за меньшее время.

Моя точка зрения заключается в том, что «легковесность» является критерием ерунды людьми, которые не знают, о чем говорят.

Как насчет оценки на основе чего-то значимого, такого как соответствие rfc? Или комбинацией соответствия rfc и производительности? В любом случае, GMime будет победителем в любом значимом сравнении, которое вы проводите.

4 голосов
/ 27 ноября 2010

Это было давно. Поэтому я просто отвечу на свой вопрос.

Потратив немного больше времени на это, я написал свою собственную реализацию. MIME действительно очень прост, и если вы прочитаете документацию, у вас что-то будет готово и работает за короткое время.

Однако я думаю, что должно быть что-то вроде vMime, но с открытым исходным кодом. Я не могу поверить, что так мало людей имеют дело со структурами MIME, поскольку это настоящий стандарт.

3 голосов
/ 31 мая 2012

Я успешно использовал миметик с моим MSVC2010. Это работает на окнах тоже. И имеет лицензию MIT.

0 голосов
/ 21 апреля 2017

Я бы предложил mimecpp , реализацию MIME на C ++.

Это очень маленький, хорошо инкапсулированный и простой в использовании. На самом деле исходный код содержит всего 7 файлов.

0 голосов
/ 09 августа 2016

Я также создал библиотеку MIME (только для Windows) с поддержкой s / mime.Но если вы не хотите использовать S / Mime, вы можете удалить определенные функции Windows.

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

...