Ich versuche herauszufinden, wie der Text einer E-Mail aus einem zitierten Antworttext heraus analysiert werden kann. Mir ist aufgefallen, dass E-Mail-Clients normalerweise ein "An so und so einem Datum so und so geschrieben" setzen oder den Zeilen eine spitze Klammer voranstellen. Leider macht das nicht jeder. Hat jemand eine Idee, wie man Antworttext programmgesteuert erkennt? Ich benutze C #, um diesen Parser zu schreiben.
c#
ruby
email
email-parsing
VanOrman
quelle
quelle
Antworten:
Ich habe viel mehr danach gesucht und hier ist, was ich gefunden habe. Grundsätzlich gibt es zwei Situationen, in denen Sie dies tun: Wenn Sie den gesamten Thread haben und wenn Sie dies nicht tun. Ich werde es in diese beiden Kategorien aufteilen:
Wenn Sie den Thread haben:
Wenn Sie die gesamte Serie von E-Mails haben, können Sie ein sehr hohes Maß an Sicherheit erreichen, dass das, was Sie entfernen, tatsächlich zitierter Text ist. Es gibt zwei Möglichkeiten, dies zu tun. Zum einen können Sie die Nachrichten-ID, die In-Reply-To-ID und den Thread-Index der Nachricht verwenden, um die einzelne Nachricht, ihre übergeordnete Nachricht und den Thread zu bestimmen, zu dem sie gehört. Weitere Informationen hierzu finden Sie in RFC822 , RFC2822 , in diesem interessanten Artikel zum Threading oder in diesem Artikel zum Threading . Nachdem Sie den Thread neu zusammengestellt haben, können Sie den externen Text (z. B. An, Von, CC usw.) entfernen und fertig.
Wenn die Nachrichten, mit denen Sie arbeiten, keine Überschriften haben, können Sie mithilfe der Ähnlichkeitsübereinstimmung auch bestimmen, welche Teile einer E-Mail der Antworttext sind. In diesem Fall müssen Sie keine Ähnlichkeitsanpassung durchführen, um den Text zu bestimmen, der wiederholt wird. In diesem Fall möchten Sie möglicherweise einen Levenshtein-Entfernungsalgorithmus wie diesen in Code Project oder diesen untersuchen .
Egal was passiert, wenn Sie am Threading-Prozess interessiert sind, lesen Sie dieses großartige PDF zum Zusammensetzen von E-Mail-Threads .
Wenn Sie den Thread nicht haben:
Wenn Sie nur eine Nachricht aus dem Thread haben, müssen Sie versuchen, das Zitat zu erraten. In diesem Fall sind hier die verschiedenen Zitiermethoden, die ich gesehen habe:
Entfernen Sie den Text von dort unten und Sie sind fertig. Der Nachteil bei all diesen ist, dass sie alle davon ausgehen, dass der Absender ihre Antwort über den zitierten Text gestellt und ihn nicht verschachtelt hat (wie es der alte Stil im Internet war). Wenn das passiert, viel Glück. Ich hoffe das hilft einigen von euch da draußen!
quelle
Zuallererst ist dies eine schwierige Aufgabe.
Sie sollten typische Antworten von verschiedenen E-Mail-Clients sammeln und korrekte reguläre Ausdrücke (oder was auch immer) vorbereiten, um sie zu analysieren. Ich habe Antworten von Outlook, Thunderbird, Google Mail, Apple Mail und mail.ru gesammelt.
Ich verwende reguläre Ausdrücke, um die Antwort auf folgende Weise zu analysieren: Wenn der Ausdruck nicht übereinstimmt, versuche ich, den nächsten zu verwenden.
So entfernen Sie das Zitat am Ende:
Hier ist meine kleine Sammlung von Testantworten (Beispiele geteilt durch --- ):
Viele Grüße, Oleg Yaroshevych
quelle
Danke, Goleg, für die Regexes! Wirklich geholfen. Dies ist kein C #, aber für die Googler da draußen ist hier mein Ruby-Parsing-Skript:
Bisher hat es ziemlich gut funktioniert.
quelle
Der mit Abstand einfachste Weg, dies zu tun, besteht darin, einen Marker in Ihren Inhalten zu platzieren, z.
--- Bitte antworten Sie über dieser Zeile ---
Wie Sie zweifellos bemerkt haben, ist das Parsen von zitiertem Text keine triviale Aufgabe, da verschiedene E-Mail-Clients Text auf unterschiedliche Weise zitieren. Um dieses Problem richtig zu lösen, müssen Sie jeden E-Mail-Client berücksichtigen und testen.
Facebook kann dies, aber wenn Ihr Projekt nicht über ein großes Budget verfügt, können Sie dies wahrscheinlich nicht.
Oleg hat das Problem mithilfe von Regexes gelöst, um den Text "Am 13. Juli 2012, um 13:09 Uhr schrieb xxx:" zu finden. Wenn der Benutzer diesen Text jedoch löscht oder wie viele andere Personen am Ende der E-Mail antwortet, funktioniert diese Lösung nicht.
Wenn der E-Mail-Client eine andere Datumszeichenfolge verwendet oder keine Datumszeichenfolge enthält, schlägt der reguläre Ausdruck ebenfalls fehl.
quelle
-- Please reply above this line. DO NOT REMOVE IT! --
. Außerdem habe ich festgestellt, dass dies nicht immer funktioniert, da einige E-Mail-Clientsxxx wrote on <datetime>:
vor dem gesamten Angebot und daher vor dieser Zeile eine Zeile hinzufügen . Diese Zeile kann mit Regex analysiert werden, sie kann jedoch in verschiedenen Sprachen und in einem anderen Format vorliegen, da sich E-Mail-Clients unterscheiden.Es gibt keinen universellen Indikator für eine Antwort in einer E-Mail. Das Beste, was Sie tun können, ist zu versuchen, die häufigsten zu finden und neue Muster zu analysieren, wenn Sie auf sie stoßen.
Denken Sie daran, dass einige Personen Antworten in den zitierten Text einfügen (mein Chef beantwortet beispielsweise Fragen in derselben Zeile, in der ich sie gestellt habe). Wenn Sie also etwas tun, verlieren Sie möglicherweise einige Informationen, die Sie gerne behalten hätten.
quelle
Hier ist meine C # -Version von @ hurshagrawals Ruby-Code. Ich kenne Ruby nicht wirklich gut, also könnte es aus sein, aber ich denke, ich habe es richtig gemacht.
quelle
Wenn Sie die ursprüngliche Nachricht steuern (z. B. Benachrichtigungen von einer Webanwendung), können Sie einen eindeutigen, identifizierbaren Header einrichten und diesen als Trennzeichen für den ursprünglichen Beitrag verwenden.
quelle
Dies ist eine gute Lösung. Fand es nach so langer Suche.
Ein Zusatz, wie oben erwähnt, ist fallweise, so dass die obigen Ausdrücke meine Antworten auf Google Mail und Outlook (2010) nicht korrekt analysiert haben, für die ich die folgenden zwei Regex (s) hinzugefügt habe. Lassen Sie mich für alle Probleme wissen.
Prost
quelle
Es ist ein alter Beitrag, jedoch nicht sicher, ob Sie wissen, dass Github eine Ruby- Bibliothek hat, die die Antwort extrahiert. Wenn Sie .NET verwenden, habe ich ein .NET unter https://github.com/EricJWHuang/EmailReplyParser
quelle
Wenn Sie die API von SigParser.com verwenden , erhalten Sie eine Reihe aller ausgebrochenen E-Mails in einer Antwortkette aus einer einzelnen E-Mail-Textzeichenfolge. Wenn es also 10 E-Mails gibt, erhalten Sie den Text für alle 10 E-Mails.
Die detaillierte API-Spezifikation können Sie hier anzeigen.
https://api.sigparser.com/
quelle