2010-06-18 45 views
5

Tengo un correo electrónico sin formato (MIME multiparte) y quiero mostrarlo en un sitio web (por ejemplo, en un iframe, con pestañas para la parte HTML y la parte de texto sin formato, etc. .). ¿Hay algún módulo de CPAN o complementos de Template :: Toolkit que pueda usar para ayudarme a lograr esto?Analizar y mostrar MIME correo electrónico de varias partes en el sitio web

Por el momento, parece que tendré que analizar el mensaje con Email :: MIME, luego iterar sobre todas las partes y escribir un controlador para todos los diferentes tipos de mime.

Es una posibilidad remota, pero me pregunto si alguien ya ha hecho todo esto. Va a ser un proceso largo y propenso a errores al escribir controladores si lo intento yo mismo.

Gracias por cualquier ayuda.

+1

Dupe of http://stackoverflow.com/questions/2795893 – daxim

+0

Gracias daxim, no lo encontré cuando miré antes. Parece que tendré que usar Email :: MIME después de todo. – aidan

Respuesta

4

No suena como un trabajo difícil para mí:

use Email::MIME; 
my $parsed = Email::MIME->new($message); 
my @parts = $parsed->parts; # These will be Email::MIME objects, too. 
print <<EOF; 
<html><head><title>!</title></head><body> 
EOF 
for my $part (@parts) {  
    my $content_type = $parsed->content_type; 
    if ($content_type eq "text/plain") { 
     print "<pre>", $part->body(), "</pre>\n"; 
    } 
    elsif ($content_type eq "text/html") { 
     print $part->body(); 
    }   
    # Handle some more cases here 
} 
print <<EOF; 
</body></html> 
EOF 
+4

Sin embargo, tendrá que desinfectarlo. ¡No desea permitir que un correo electrónico inyecte JS arbitrario en su sitio! – Quentin

+2

Sin mencionar las entidades de codificación en una parte de texto/plano. – cjm

+0

Todavía no me parece un gran trabajo. Las entidades son así de duras: 's/([<> &]) /" & # ". Ord ($ 1)."; "/ Ge' y HTML sanitizing a través de' HTML :: Scrubber'. –

2

reutilización completa del software existente. El MHonArc mail-to-HTML converter tiene excelente soporte MIME.

+0

Esto podría ser exactamente lo que estoy buscando en realidad. Investigará ... Gracias. – aidan

6

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)

Cuestiones relacionadas