2012-04-01 10 views
7

Moja aplikacja odbiera wiadomości e-mail od użytkowników. Odpowiedź na przykład z Gmaila jest następująca:Pozbycie się oryginalnej wiadomości z odpowiedzi e-mailowej

This is some new text 

On Sun, Apr 1, 2012 at 3:32 AM, My app < 
[email protected]> wrote: 

> Original... 
> message.. 

Oczywiście ten zabieg różni się w zależności od klienta.

W tej chwili identyfikuję "4f77ed3860c258a567aeabf8" i wyrzucam wszystko później, ponieważ wiem, do jakiego adresu wysłano. To nie jest ogólne rozwiązanie, ale działa dla moich celów, z wyjątkiem, gdy w wierszu "Oryginalna wiadomość" występuje podział linii, jak w powyższym przykładzie.

Czy istnieje lepszy, standardowy sposób usuwania wcześniejszych wiadomości z odpowiedzi użytkownika na wiadomość e-mail?

Odpowiedz

3

Jeśli chcesz mieć 100% możliwość usunięcia czegokolwiek poza najnowszym wpisem, porównaj każdy znak z nowej i poprzedniej. Jeśli nie chcesz pisać własnego parsera diff, sprawdź tę bibliotekę.

https://github.com/cemerick/jsdifflib

Albo jeśli chcesz nośności Algo ten jeden

http://ejohn.org/projects/javascript-diff-algorithm/

+0

problem z tym jest to, że edycja będzie nieprawidłowo okazji „dnia Sun, Apr 1 ... XX napisał: "w ramach nowej wiadomości. Wygląda na to, że jedynym rozwiązaniem może być dowiedzieć się, jak reaguje każdy klient (Gmail, Outlook itp.). –

+0

Założę się, że większość dostawców zawsze umieszcza to na linii nowej linii. Nie możesz po prostu zrobić diff, niż usunąć linię między ostatnim linebreakiem a następnym do ostatniego? więc twój przykład, czy to rzeczywiście wielowierszowe czy po prostu wklejone? – FlavorScape

+0

To jest w rzeczywistości wieloliniowy w podanym przeze mnie przykładzie. Moi użytkownicy mają również zwyczaj nie zachowywać nowego wiersza między wiadomością a linią dostawcy. Wydaje mi się, że mogę wymyślić parę heurystyk, gdy zdobywam ciągi "oryginalnej wiadomości" każdego klienta ... –

3

Jest moduł npm nazywane emailreplyparser, który zostanie przeniesiony z biblioteki github ruby, która to robi. Jak podkreślasz, formaty używane do tego nie są standardowe, a zatem każde rozwiązanie będzie dość kruche i niedoskonałe, ale czy nie będzie to jednoznaczne?

Oto przykład, w którym biorę odpowiedź JSON, którą otrzymałem od nowego interfejsu Gmail API i uzyskuję dostęp tylko do nowego tekstu odpowiedzi danej wiadomości.

var erp = require('emailreplyparser').EmailReplyParser.read; 
var message = require('./sample_message.json'); 
var buffer = new Buffer(message.payload.parts[0].body.data, 'base64'); 
var body = buffer.toString(); 
//body is the whole message, the new text and the quoted reply portion 
// console.log(body); 
var parsed = erp(body); 
//this has just the text of the reply itself 
console.log(parsed.fragments[0].content); 

Uwaga: może być kilka interesujących fragmentów, jeśli autor przekładał tekst odpowiedzi i cytował fragmenty wiadomości.

0

proszę sprawdzić mój kod myślę, że obejmują one wszystkich przypadków jak repo zawiera un rozpatrzenia sprawy jeśli istnieje więcej niż jedna odpowiedź w wiadomości i (Na < data> < email> napisał wiersz :) jest podzielona pomiędzy więcej niż jedną linię to działa źle i to tej linii (na < data> < email> napisał :) z nim jako część odpowiedzi

function getReplyOnly(str){ 
    str = str || ''; 
    var exp = /^(>)*\s*(On\s(\n|.)*wrote:)/m; 
    var exp2 = /(\s|.|\n)*((wrote:)$)/m; 
    var exp3 = /^((\s)*(On))/m; 

    var arr = str.split('\n'); 
    var msg = ''; 

    var foundEndWrote = false; 
    var foundStartOn = false; 
    var indexes = []; 
    var tempStr = ''; 

    for(var i = arr.length - 1; i >= 0; i--){ 
    tempStr = arr[i] + tempStr; 
    if(exp2.test(arr[i])){ 
     foundEndWrote = true; 
    } 

    if(exp2.test(arr[i])){ 
     foundStartOn = true; 
    } 

    indexes.push(i); 
    if(exp.test(tempStr) && foundEndWrote && foundStartOn){ 
     clear(); 
    } 
    } 

    function clear(){ 
    tempStr = ''; 
    indexes = []; 
    foundEndWrote = false; 
    foundStartOn = false; 
    } 

    // create the message 
    for(var i = indexes.length - 1; i >= 0; i--){ 
    msg += ('\n' + arr[indexes[i]]); 
    } 
    return msg; 
} 
Powiązane problemy