En realidad acabo de resolver este problema hace unos meses. Agregué una función de correo electrónico al producto para el que trabajo, tanto para enviar como para recibir. La primera parte fue enviar recordatorios a los usuarios, pero no queríamos administrar los rebotes para nuestros administradores de clientes, decidimos tener una bandeja de entrada de mensajes para que los administradores pudieran ver los rebotes y las respuestas sin nosotros, y los administradores pueden ocuparse de ajustar direcciones de correo electrónico si es necesario.
Debido a esto, aceptamos todos los correos electrónicos que se envían a una bandeja de entrada que miramos. Utilizamos VERP para asociar un correo electrónico con un usuario y almacenar todo el correo electrónico tal como está en la base de datos. Luego, cuando el administrador solicite ver el correo electrónico, debemos analizar el correo electrónico.
Mi primer intento fue muy similar a una respuesta anterior. Si una de las partes es html, muéstrela. Si es texto, muéstralo. De lo contrario, muestre el correo electrónico original sin procesar. Esto se rompió muy rápido con algunos correos electrónicos no generados por sendmail. Outlook, Exchange y algunos otros sistemas de correo electrónico no hacen eso, usan varias partes para enviar el correo electrónico. Después de mucho cavar y maldecir, descubrí que el problema no parece estar bien documentado. Con la ayuda de mirar a través de MHonArc y leer los RFC (RFC2045 y RFC2046), decidí la siguiente solución. Decidí no usar MHonArc, ya que no pude reutilizar fácilmente la funcionalidad de análisis y visualización. No diría que esto es perfecto, pero ha sido lo suficientemente bueno como para haberlo usado.
Primero, tome el mensaje y use Email :: MIME para analizarlo. Luego llama a una función llamada get_part con la matriz de partes Email :: MIME te da con -> parts().
get_part, para cada parte que se pasó, decodifica el tipo de contenido, lo busca en un hash y, si existe, llama a la función asociada con ese tipo de contenido. Si el decodificador pudo darnos algo, colóquelo en una matriz de resultados.
La última pieza del rompecabezas es esta matriz de decodificador.Básicamente, se definen los tipos de contenido que pueda hacer frente a:
- text/html
- text/plain
- mensaje/entrega de la condición, que en realidad es también el texto sin formato
- multiparte/mixto
- multiparte/relacionado
- multipart/alternative
Las secciones no multiparte vuelvo como es. Con mixed, related y alternative, simplemente llamo get_parts en ese nodo MIME y devuelvo los resultados. Como la alternativa es especial, tiene un código adicional después de llamar a get_parts. Solo devolverá html si tiene una parte html, o devolverá solo la parte de texto que tiene una parte de texto. Si no tiene ninguno, no devolverá nada válido.
La ventaja del hash de los tipos de contenido válidos es que puedo agregar fácilmente lógica para más partes según sea necesario. Y para cuando consigas get_parts, deberías tener una matriz de todo el contenido que te interese.
Un artículo más que debería mencionar. Como parte de esto, creamos un dominio separado que realmente sirve estos mensajes. El dominio principal en el que trabaja un administrador se negará a publicar el mensaje y redirigirá el navegador a nuestro dominio de contenido de usuario. Este segundo dominio solo servirá contenido del usuario. Esto es para ayudar al navegador a guardar el contenido de manera adecuada fuera de nuestro dominio principal. Ver la misma política de origen (http://en.wikipedia.org/wiki/Same_origin_policy)
Dupe of http://stackoverflow.com/questions/2795893 – daxim
Gracias daxim, no lo encontré cuando miré antes. Parece que tendré que usar Email :: MIME después de todo. – aidan