2010-06-14 17 views
6

He buscado en la web por días pero parece que no puedo encontrar una buena solución a mi problema:¿Analizar archivos MIME simples de C/C++?

Para uno de mis proyectos estoy buscando un buen (ligero) analizador MIME. Mi cliente proporciona archivos formateados MIME (lineales, sin jerarquía) que contienen 3-4 "partes". La aplicación debe poder dividir esas partes y procesarlas de forma independiente.

Básicamente, esos archivos MIME son como mensajes crudos de correo electrónico, pero sin los encabezados SMTP. En su lugar, comienzan con MIME-Header "MIME-Version: 1.0" y luego siguen las partes.

Estoy usando C++ para la aplicación, por lo que una biblioteca C++ es bienvenida. Una biblioteca C estándar también es bienvenida; pero debe ajustarse a los siguientes criterios:

  • estar abiertos (al menos LGPL), no properiaty
  • compacto - Sólo necesito el analizador, no hay soporte SMTP/POP3
  • entre plataformas (con el objetivo de Windows, Mac OS X y Linux)

Después de días de búsqueda me encontré con las siguientes librerías y razones por las que no usarlos:

  • mimetic (C++) --- Aunque esta biblioteca parece completa y para el uso de C++, se basa en glib, que no se compilará correctamente en Windows.
  • Vmime (C++) --- Parece completo, pero no hay soporte oficial de Windows. También proporcionan "licencias dobles" ("LGPL comercial" + GPL). Parece estar incluido con Ubuntu y Debian, pero la licencia es confusa.
  • mime++ --- Commerical, no compatible con Mac.
  • Chilkat Software MIME C++ Library --- Commerical y centrado en Windows.

Realmente no quiero escribir mi propio analizador MIME. MIME está tan extendido que hay debe ser una biblioteca abierta para manejar este formato de archivo de una manera sensata.

Entonces, ¿tienen alguna idea, sugerencia o vínculo?

¡Gracias de antemano!

+0

La estructura MIME es lo suficientemente simple como para que cualquiera pueda escribir un analizador. Por lo general, donde se encuentra con problemas es con los detalles del mensaje; idioma, codificación, etc. Dependiendo de sus necesidades de procesamiento, podría escribir su propio analizador. Sin embargo, si necesita hacer algo complejo, definitivamente debe tratar de encontrar una biblioteca que haga todo el trabajo pesado por usted. – Luke

+0

mimético no se basa en glib. ¿Estás confundiendo mimético con gmime? – uckelman

Respuesta

4

Ha pasado tiempo. Así que solo responderé mi propia pregunta.

Después de pasar más tiempo en esto, terminé escribiendo mi propia implementación. MIME es bastante simple, y si lee la documentación, tiene algo en funcionamiento en poco tiempo.

Sin embargo, creo que debería haber algo como vMime, pero de código abierto. No puedo creer que tan poca gente tenga que lidiar con estructuras MIME, ya que es un estándar real.

+0

Bien explicado ... – iOS

+3

Vmime * es * de código abierto. – uckelman

+0

@uckelman Sí, pero bajo la GPL. Eso no funcionará para todas las situaciones. – jtmoulia

3

He utilizado con éxito mimetic con mi MSVC2010. También funciona en Windows. Y tiene licencia de MIT.

6

GMime es un analizador mime LGPL escrito en C. Depende de glib, pero glib está disponible en Windows: 32bit y 64bit (y todas las plataformas basadas en Unix, incluido Mac OS X). También se crea dentro de Visual Studio afaict, por lo que no veo cuál es el problema. Sé que hay al menos 1 proveedor comercial de Windows que envía libgmime.dll y libglib.dll en su producto (Kerio Connect, iirc). Nokia incluso lo envía en algunos de sus teléfonos.

Realmente no existe un analizador de mime "liviano" si realmente se espera que haga algo más que dividir los encabezados en ':' y hacer un análisis aleatorio del encabezado Content-Type para buscar un límite cadena y luego continúe manejando multipartes no anidadas (algo inútil fuera de analizar las respuestas http y mensajes mime pre-enlatados de los que usted controla la composición).

La razón por la cual los analizadores como GMime son tan "grandes", en lo que respecta a las líneas de código, se debe a que están destinados a desarrolladores que realmente desean un correcto y sólido mime-parte y cabecera de análisis/decodificación. Vea mi diatriba sobre decoding rfc2047 encoded-word tokens para tener una idea de cuán complejo puede ser esto (por cierto, aparte de GMime y MimeKit, aún no he encontrado ningún analizador de mime de código abierto capaz de manejar todos los casos extremos discutidos en mi discurso).

Incluso con todo este procesamiento extra robusto, es todavía tan rápido o más rápido que la mayoría de los analizadores de mime "livianos", especialmente si se tiene en cuenta que la mayoría usa un enfoque de lectura. He visto analizadores de mime "ligeros" con el objetivo de analizar archivos de correo electrónico de 25 MB en 2-3 segundos y considerar que es "rápido". Mi unidad prueba para GMime analizar 2 archivos mbox llenos de mensajes de más de 1,2 GB (sí, gigabytes) en menos tiempo que eso.

Mi punto es que "liviano" es un criterio de mierda por personas que no saben de lo que están hablando.

¿Qué tal juzgar en base a algo significativo como el cumplimiento de rfc? ¿O mediante una combinación de cumplimiento y rendimiento de rfc? De cualquier forma, GMime saldrá ganador en cualquier comparación significativa que haga.

+1

Es una diatriba divertida. Pero no puedo aceptar que el "peso ligero" sea un requisito de "mierda". libgmime es liviano - 142KB según mi sistema - y eficiente de acuerdo con tus pruebas. Algunos analizadores de otros estándares alcanzan los 100 MB más. Agregar un analizador de 100MB a un programa de 500KB puede no ser apropiado y usar un analizador sintáctico que solo implemente un subconjunto del estándar puede ser la opción correcta * según el contexto *. –

0

Yo sugeriría mimecpp, una implementación en C++ de MIME.

Es muy pequeño, bien encapsulado y fácil de usar. De hecho, el código fuente solo contiene 7 archivos.