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)
Dupe von http://StackOverflow.com/Questions/2795893 – daxim
Dank Daxim, habe ich nicht gefunden, wenn ich vorher schaute. Sieht so aus, als müsste ich Email :: MIME benutzen. – aidan