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)
Dupe de http://stackoverflow.com/questions/2795893 – daxim
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