2010-06-18 18 views
5

J'ai un email brut, (MIME multipart), et je veux l'afficher sur un site web (par exemple dans un iframe, avec des onglets pour la partie HTML et la partie texte, etc. .). Y at-il des modules CPAN ou des plugins Template :: Toolkit que je peux utiliser pour m'aider à y parvenir?Analyser et afficher l'email multipart MIME sur le site web

Pour le moment, il semblerait que je devrais analyser le message avec Email :: MIME, puis parcourir toutes les parties et écrire un gestionnaire pour tous les différents types de mime.

C'est long, mais je me demande si quelqu'un a déjà fait tout cela? Ça va être un processus long et sujet aux erreurs d'écriture des gestionnaires si je tente moi-même.

Merci pour toute aide.

+1

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

+0

Merci daxim, je n'ai pas trouvé ça quand j'ai regardé avant. On dirait que je vais devoir utiliser Email :: MIME après tout. – aidan

Répondre

4

Il ne ressemble pas à un travail difficile pour moi:

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

Vous devrez cependant le désinfecter. Vous ne voulez pas laisser un email injecter JS arbitraire dans votre site! – Quentin

+2

Sans oublier les entités de codage dans une partie texte/brut. – cjm

+0

Cela ne me semble toujours pas un gros travail. Les entités sont robustes: 's/([<> &]) /" & # ". Ord ($ 1)."; "/ Ge' et la désinfection HTML via' HTML :: Scrubber'. –

2

réutilisation logiciel complet existant. Le MHonArc mail-to-HTML converter a un excellent support MIME.

+0

Cela pourrait être exactement ce que je cherche réellement. Va enquêter ... Merci. – aidan

6

En fait, j'ai juste traité ce problème il y a quelques mois. J'ai ajouté une fonctionnalité d'email au produit pour lequel je travaille, à la fois l'envoi et la réception. La première partie envoyait des rappels aux utilisateurs, mais nous ne voulions pas gérer les rebonds pour nos admins clients, nous avons décidé d'avoir une boîte de réception que les admins pouvaient voir rebondir et répondre sans nous, et les admins pouvaient gérer les ajustements. adresses e-mail si nécessaire. Pour cette raison, nous acceptons tous les e-mails envoyés à une boîte de réception que nous regardons. Nous utilisons VERP pour associer un e-mail à un utilisateur et stocker l'intégralité de l'e-mail tel qu'il est dans la base de données. Ensuite, lorsque l'administrateur demande à voir l'email, nous devons analyser l'email.

Ma première tentative était très similaire à une réponse antérieure. Si l'une des parties est html, montrez-la. Si c'est du texte, montrez-le. Sinon, affichez l'e-mail brut original. Cela s'est brisé très rapidement avec quelques emails non générés par sendmail. Outlook, Exchange et quelques autres systèmes de messagerie ne le font pas, ils utilisent plusieurs parties pour envoyer le courrier électronique. Après beaucoup de fouilles et de jurons, j'ai découvert que le problème ne semblait pas bien documenté. Avec l'aide de MHonArc et en lisant les RFC (RFC2045 et RFC2046), j'ai choisi la solution ci-dessous. J'ai décidé de ne pas utiliser MHonArc, car je ne pouvais pas facilement réutiliser les fonctionnalités d'analyse et d'affichage. Je ne dirais pas que c'est parfait, mais ça a été assez bon que nous l'utilisions.

D'abord, prenez le message et utilisez Email :: MIME pour l'analyser. Ensuite, appelez une fonction appelée get_part avec le tableau de pièces Email :: MIME vous donne avec -> parts(). Get_part, pour chaque partie qui lui a été transmise, décode le type de contenu, le recherche dans un hachage et, s'il existe, appelle la fonction associée à ce type de contenu. Si le décodeur était capable de nous donner quelque chose, placez-le sur un tableau de résultats.

La dernière pièce du puzzle est ce tableau décodeur.Fondamentalement, il définit les types de contenu que je peux traiter:

  • text/html
  • type text/plain
  • un message/livraison statut, qui est en fait également le texte brut
  • multipart/mixte
  • multipart/connexes
  • multipart/alternative

Les sections non-multipart Je reviens tout comme. Avec mixed, related et alternative, j'appelle simplement get_parts sur ce noeud MIME et renvoie les résultats. Puisque l'alternative est spéciale, elle a du code supplémentaire après avoir appelé get_parts. Il retournera seulement html s'il a une partie html, ou il retournera seulement la partie de texte de celui-ci a une partie de texte. S'il n'a ni l'un ni l'autre, il ne renverra rien de valable. L'avantage avec le hachage des types de contenu valides est que je peux facilement ajouter de la logique pour plus de pièces si nécessaire. Et au moment où vous avez get_parts, vous devriez avoir un tableau de tout le contenu qui vous intéresse.

Encore un élément que je devrais mentionner. Dans le cadre de cela, nous avons créé un domaine distinct qui sert réellement ces messages. Le domaine principal sur lequel un administrateur travaille refuse de diffuser le message et de rediriger le navigateur vers notre domaine de contenu utilisateur. Ce deuxième domaine ne servira que le contenu de l'utilisateur. Ceci est pour aider le navigateur à bac à sable correctement le contenu de notre domaine principal. Voir la même politique d'origine (http://en.wikipedia.org/wiki/Same_origin_policy)