2010-06-18 9 views
5

Ich habe eine rohe E - Mail, (MIME multipart), und ich möchte dies auf einer Website anzeigen (zB in einem iframe, mit Tabs für den HTML - Teil und den Klartextteil etc .). Gibt es CPAN-Module oder Template :: Toolkit-Plugins, mit denen ich das erreichen kann?Parsen und Anzeigen von MIME Multipart E - Mail auf der Website

Im Moment sieht es so aus, als müsste ich die Nachricht mit Email :: MIME parsen, dann über alle Teile iterieren und einen Handler für alle verschiedenen MIME-Typen schreiben.

Es ist ein langer Schuss, aber ich frage mich, ob jemand das alles bereits getan hat? Es wird ein langer und fehleranfälliger Prozess sein, der Handler schreibt, wenn ich es selbst versuche.

Danke für jede Hilfe.

+1

Dupe von http://StackOverflow.com/Questions/2795893 – daxim

+0

Dank Daxim, habe ich nicht gefunden, wenn ich vorher schaute. Sieht so aus, als müsste ich Email :: MIME benutzen. – aidan

Antwort

4

Es klingt nicht wie eine schwierige Aufgabe zu mir:

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

Sie müssen es jedoch sterilisieren. Sie möchten nicht, dass eine E-Mail willkürliche JS in Ihre Site injiziert! – Quentin

+2

Ganz zu schweigen von Encoding-Entities in einem text/plain-Teil. – cjm

+0

Das klingt für mich immer noch nicht nach einer großen Aufgabe. Entities sind das hart: 's/([<> &]) /" & # ". Ord ($ 1)."; "/ Ge' und HTML-Bereinigung über' HTML :: Scrubber'. –

2

Wiederverwendung bestehende komplette Software. Die MHonArc mail-to-HTML converter hat ausgezeichnete MIME-Unterstützung.

+0

Das könnte genau das sein, wonach ich eigentlich suche. Wird nachforschen ... Danke. – aidan

6

Ich habe gerade erst vor ein paar Monaten mit diesem Problem beschäftigt. Ich habe dem Produkt, für das ich arbeite, eine E-Mail-Funktion hinzugefügt, sowohl zum Senden als auch zum Empfangen. Der erste Teil sendete Erinnerungen an die Benutzer, aber wir wollten die Rückläufer für unsere Kundenadministratoren nicht verwalten. Wir entschieden uns für eine Nachricht, dass die Admins Prellen und Antworten ohne uns sehen konnten und die Admins mit der Anpassung fertig werden konnten E-Mail-Adressen, wenn sie benötigt werden.

Aus diesem Grund akzeptieren wir alle E-Mails, die an einen Posteingang gesendet werden. Wir verwenden VERP, um einem Benutzer eine E-Mail zuzuordnen und die gesamte E-Mail so zu speichern, wie sie in der Datenbank vorhanden ist. Wenn der Administrator dann anfordert, die E-Mail zu sehen, müssen wir die E-Mail analysieren.

Mein erster Versuch war sehr ähnlich zu einer früheren Antwort. Wenn einer der Teile HTML ist, zeig es. Wenn es Text ist, zeig es. Andernfalls zeigen Sie die ursprüngliche, rohe E-Mail an. Dies ging sehr schnell mit einigen E-Mails, die nicht von sendmail generiert wurden, kaputt. Outlook, Exchange und einige andere E-Mail-Systeme tun dies nicht, sie verwenden multiparts zum Senden der E-Mail. Nach langem Graben und Fluchen stellte ich fest, dass das Problem nicht gut dokumentiert ist. Mit Hilfe von MHonArc und dem Lesen der RFCs (RFC2045 und RFC2046) entschied ich mich für die folgende Lösung. Ich entschied mich dafür, MHonArc nicht zu verwenden, da ich die Analyse- und Anzeigefunktionen nicht einfach wieder verwenden konnte. Ich würde nicht sagen, dass das perfekt ist, aber es war gut genug, dass wir es benutzt haben.

Nehmen Sie zuerst die Nachricht und verwenden Sie E-Mail :: MIME, um es zu analysieren. Dann rufen Sie eine Funktion namens get_part mit dem Array von Teilen Email :: MIME gibt Ihnen mit -> Teile().

get_part dekodiert für jeden übergebenen Teil den Inhaltstyp, sucht ihn in einem Hash, und wenn er existiert, rufen Sie die Funktion auf, die diesem Inhaltstyp zugeordnet ist. Wenn der Decoder uns etwas geben konnte, legen Sie ihn auf ein Ergebnis-Array.

Das letzte Stück des Puzzles ist dieses Decoder-Array.Grundsätzlich definiert es die Inhaltstypen ich mit umgehen können:

  • text/html
  • text/plain
  • Nachricht/Lieferstatus, die eigentlich auch Klartext ist
  • mehrteilig/gemischt
  • mehrteilig/bezogen
  • mehrteiliger/alternative

Die nicht mehrteiligen Abschnitte I zurück gibt. Mit gemischten, verwandten und alternativen Methoden rufe ich lediglich get_parts auf diesem MIME-Knoten auf und gibt die Ergebnisse zurück. Weil Alternative etwas Besonderes ist, hat es nach dem Aufruf von get_parts zusätzlichen Code. Es gibt nur HTML zurück, wenn es einen HTML-Teil hat, oder es gibt nur den Textteil zurück, der einen Textteil hat. Wenn es keine hat, gibt es nichts Gültiges zurück.

Der Vorteil mit dem Hash der gültigen Inhaltstypen ist, dass ich Logik für mehr Teile nach Bedarf leicht hinzufügen kann. Und wenn du get_parts erledigt hast, solltest du eine Reihe von Inhalten haben, die dir wichtig sind.

Noch ein Punkt, den ich erwähnen sollte. Als Teil davon haben wir eine separate Domäne erstellt, die diese Nachrichten tatsächlich bedient. Die Hauptdomäne, an der ein Administrator arbeitet, verweigert die Zustellung der Nachricht und leitet den Browser an unsere Benutzerinhaltsdomäne weiter. Diese zweite Domäne wird nur Benutzerinhalte bereitstellen. Dies dient dazu, dem Browser zu helfen, den Inhalt von unserer Hauptdomäne aus richtig zu verteilen. Siehe gleiche Herkunft Politik (http://en.wikipedia.org/wiki/Same_origin_policy)