2012-04-01 8 views
7

La mia applicazione riceve email dagli utenti. Una risposta da Gmail, ad esempio, viene in questo modo:Estrarre il messaggio originale da una risposta via email

This is some new text 

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

> Original... 
> message.. 

Naturalmente, questo trattamento varia da cliente a cliente.

In questo momento sto identificando il '4f77ed3860c258a567aeabf8' e buttando fuori tutto dopo, perché so a quale indirizzo email hanno inviato. Questa non è una soluzione generale ma funziona per i miei scopi, eccetto per quando c'è un'interruzione di riga nella riga "Messaggio originale", come nell'esempio precedente.

Esiste un modo migliore e standard per eliminare i messaggi precedenti dalla risposta dell'utente a un'email?

risposta

3

Se si desidera un metodo 100% per rimuovere qualsiasi cosa tranne il post più recente, confrontare ciascun carattere dal nuovo messaggio e quello precedente. Se non vuoi scrivere il tuo pars pars, dai un'occhiata a questa lib.

https://github.com/cemerick/jsdifflib

Oppure, se si vuole un controllo algo leggero questo fuori

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

+0

il problema di questo è che un diff non correttamente segnerà "On Sun, Apr 1 ... XX ha scritto: "come parte del nuovo messaggio. Sembra che l'unica soluzione potrebbe essere semplicemente imparare come ogni cliente (gmail, outlook, ecc.) Risponde. –

+0

Direi che la maggior parte dei provider lo metterebbe sempre su una nuova riga. Non riesci a fare la differenza che cancellare la linea tra l'ultima interruzione di riga e la penultima? quindi, il tuo esempio, è in realtà un multi-linea o semplicemente come è stato incollato? – FlavorScape

+0

In realtà è multilinea nell'esempio che ho postato. I miei utenti hanno anche l'abitudine di non conservare la nuova riga tra il loro messaggio e la linea del provider. Penso di poter inventare un paio di euristiche mentre raccolgo le stringhe del "messaggio originale" di ciascun cliente ... –

3

C'è un modulo NPM chiamato emailreplyparser, che viene portato da una libreria github rubino, che fa questo. Come fai notare, i formati utilizzati non sono standard e quindi qualsiasi soluzione sarà piuttosto fragile e imperfetta ma whaddayagonnado?

Ecco un esempio in cui prendo una risposta JSON ottenuta dalla nuova API di Gmail e accesso con successo solo al nuovo testo di risposta di un determinato messaggio.

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); 

Nota possono esserci diversi frammenti interessanti se l'autore intercala testo di risposta e cita frammenti di messaggio.

0

si prega di controllare il mio codice penso che coprono tutti i casi come il repo contiene un caso gestito se non v'è più di una risposta nel messaggio e il (On < Data> < Email> ha scritto :) linea è divisa tra più di una riga funziona male e includere questa linea (On < Data> < Email> ha scritto :) con esso come una parte della risposta

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; 
} 
Problemi correlati