2010-06-18 20 views
5

Ho un'e-mail non elaborata (MIME multipart) e desidero visualizzarla su un sito Web (ad esempio in un iframe, con schede per la parte HTML e la parte di testo normale, ecc. .). Esistono moduli CPAN o plugin Template :: Toolkit che posso utilizzare per aiutarmi a raggiungere questo obiettivo?Analizza e visualizza l'e-mail multipart MIME sul sito web

Al momento, sembra che dovrò analizzare il messaggio con Email :: MIME, quindi scorrere tutte le parti e scrivere un gestore per tutti i diversi tipi di mime.

Si tratta di un campo lungo, ma mi chiedo se qualcuno ha già fatto tutto questo? Sarà un processo lungo e soggetto a errori di scrittura di gestori se lo provo da solo.

Grazie per qualsiasi aiuto.

+1

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

+0

Grazie daxim, non l'ho trovato quando ho guardato prima. Sembra che dovrò usare Email :: MIME dopo tutto. – aidan

risposta

4

Non suona come un lavoro difficile per me:

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

Tuttavia, sarà necessario disinfettarlo. Non vuoi lasciare che una email inserisca JS arbitrario nel tuo sito! – Quentin

+2

Per non parlare delle entità di codifica in una parte text/plain. – cjm

+0

Ancora non mi sembra un grosso lavoro per me. Le entità sono così difficili: 's/([<> &]) /" & # ". Ord ($ 1)."; "/ Ge' e HTML sanitizing tramite' HTML :: Scrubber'. –

2

riutilizzo software completo esistente. Lo MHonArc mail-to-HTML converter ha un eccellente supporto MIME.

+0

Questo potrebbe essere esattamente quello che sto cercando in realtà. Investigherà ... Grazie. – aidan

6

In realtà ho appena affrontato questo problema solo pochi mesi fa. Ho aggiunto una funzionalità di posta elettronica al prodotto per cui lavoro, sia per l'invio che per la ricezione. La prima parte era l'invio di promemoria agli utenti, ma non volevamo gestire i rimbalzi per i nostri amministratori dei clienti, abbiamo deciso di avere una casella di posta in cui gli amministratori potevano vedere rimbalzi e risposte senza di noi e gli amministratori possono occuparsi della regolazione indirizzi email se necessario.

Per questo motivo, accettiamo tutte le e-mail inviate a una casella di posta che guardiamo. Utilizziamo VERP per associare un messaggio di posta elettronica a un utente e archiviare l'intera e-mail così come è nel database. Quindi, quando l'amministratore richiede di vedere l'email, dobbiamo analizzare l'email.

Il mio primo tentativo è stato molto simile a una risposta precedente. Se una delle parti è html, mostralo. Se è un testo, mostralo. Altrimenti, mostra l'email originale e non elaborata. Questo si è interrotto molto velocemente con alcune e-mail non generate da sendmail. Outlook, Exchange e alcuni altri sistemi di posta elettronica non lo fanno, usano multiparts per inviare l'e-mail. Dopo un sacco di scavi e imprecazioni, ho scoperto che il problema non sembra essere ben documentato. Con l'aiuto di guardare attraverso MHonArc e leggere le RFC (RFC2045 e RFC2046), ho optato per la soluzione di seguito. Ho deciso di non utilizzare MHonArc, dal momento che non potevo facilmente riutilizzare la funzionalità di analisi e visualizzazione. Non direi che questo è perfetto, ma è stato abbastanza buono da usarlo.

Prima di tutto, prendi il messaggio e usa Email :: MIME per analizzarlo. Quindi chiama una funzione chiamata get_part con l'array di parti. Email :: MIME ti fornisce -> parts().

get_part, per ogni parte passata, decodifica il tipo di contenuto, lo cerca in un hash e, se esiste, chiama la funzione associata a quel tipo di contenuto. Se il decoder era in grado di darci qualcosa, mettilo su un array di risultati.

L'ultimo pezzo del puzzle è questo array di decodificatori.In sostanza, definisce i tipi di contenuto che posso affrontare:

  • text/html
  • text/plain
  • messaggio/consegna-stato, che in realtà è anche il testo normale
  • multipart/mixed
  • multipart/related
  • multipart/alternative

Le sezioni non multistrato torno come è. Con mixed, related e alternative, mi limito a chiamare get_parts su quel nodo MIME e restituisco i risultati. Perché l'alternativa è speciale, ha qualche codice in più dopo aver chiamato get_parts. Restituirà solo html se ha una parte html, o restituirà solo una parte di testo con una parte di testo. Se non ha né, non restituirà nulla valido.

Il vantaggio con l'hash dei tipi di contenuto validi è che posso facilmente aggiungere la logica per più parti, se necessario. E quando hai ottenuto get_parts, dovresti avere una serie di tutti i contenuti che ti interessano.

Un altro elemento che dovrei menzionare. Come parte di questo, abbiamo creato un dominio separato che serve effettivamente questi messaggi. Il dominio principale su cui lavora un amministratore si rifiuterà di servire il messaggio e reindirizzare il browser al nostro dominio dei contenuti utente. Questo secondo dominio servirà solo il contenuto dell'utente. Questo per aiutare il browser a sandboxare correttamente il contenuto lontano dal nostro dominio principale. Vedere lo stesso criterio di origine (http://en.wikipedia.org/wiki/Same_origin_policy)