2010-06-14 1 views
6

Я искал веб в течение нескольких дней, но я не могу найти подходящее решение для своей проблемы:Анализ простых MIME-файлов с C/C++?

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

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

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

  • быть открытым (по крайней мере, LGPL), не properiaty
  • Compact - я просто нужен анализатор, нет поддержки SMTP/POP3
  • Cross-Platform (таргетинг для Windows, Mac OS X и Linux)

После нескольких дней поисков я нашел следующие LIBS и причины, чтобы не использовать их:

  • mimetic (C++) --- Хотя эта библиотека кажется полной и для использования на C++, она основана на glib, который не будет правильно компилироваться в Windows.
  • Vmime (C++) --- Похоже, что официальной поддержки Windows нет. Также они обеспечивают «двойное лицензирование» («коммерческий LGPL» + GPL). Кажется, он будет включен в Ubuntu и Debian, но лицензирование запутывает.
  • mime++ --- Коммерческая, без поддержки Mac.
  • Chilkat Software MIME C++ Library --- Коммерческая и сосредоточена на Windows.

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

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

Заранее благодарен!

+0

Структура MIME достаточно проста, чтобы любой мог писать парсер. Обычно, когда вы сталкиваетесь с проблемами, это детали сообщения; язык, кодирование и т. д. В зависимости от ваших потребностей в обработке вы можете написать собственный парсер. Однако, если вам нужно сделать что-нибудь сложное, вам обязательно нужно найти библиотеку, которая сделает весь тяжелый подъем для вас. – Luke

+0

Миметик не основан на glib. Вы смешиваете миметик с gmime? – uckelman

ответ

4

Прошло некоторое время. Поэтому я просто отвечу на свой вопрос.

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

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

+0

Хорошо объяснил .. – iOS

+3

Vmime * есть * open-source. – uckelman

+0

@uckelman Да, но под GPL. Это не будет работать для всех ситуаций. – jtmoulia

3

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

6

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

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

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

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

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

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

+1

Его весело напыщенная речь. Но я не могу согласиться с тем, что «легкий вес» - это требование «дерьма». libgmime - легкий вес - 142 КБ в соответствии с моей системой - и эффективен в соответствии с вашими испытаниями. Некоторые парсеры для других стандартов достигают 100 МБ плюс. Добавление парсера 100 МБ к программе 500 КБ может оказаться неприемлемым, и использование парсера, который реализует только подмножество стандарта, может быть правильным выбором * в зависимости от контекста *. –

0

Я хотел бы предложить mimecpp, а реализация MIME C++.

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