2012-04-01 16 views
7

Mi aplicación recibe el correo electrónico de los usuarios. Una respuesta de Gmail, por ejemplo, se presenta en la siguiente manera:Eliminación del mensaje original de una respuesta de correo electrónico

This is some new text 

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

> Original... 
> message.. 

Por supuesto, este tratamiento varía de un cliente a otro.

Ahora estoy identificando el '4f77ed3860c258a567aeabf8' y tirando todo después, porque sé a qué dirección de correo electrónico me han enviado. Esta no es una solución general, pero funciona para mis propósitos, excepto para cuando hay un salto de línea en la línea "Mensaje original", como en el ejemplo anterior.

¿Existe una forma mejor y estándar para eliminar mensajes pasados ​​de la respuesta de un usuario a un correo electrónico?

Respuesta

3

Si desea eliminar al 100% todo lo que no sea la publicación más reciente, compare cada carácter del mensaje nuevo y el anterior. Si no desea escribir su propio analizador de diferencias, consulte esta lib.

https://github.com/cemerick/jsdifflib

O si quieres un cheque algo ligero éste hacia fuera

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

+0

el problema con esto es que un diff de forma incorrecta marcar "en Sun, 1 de abril ... XX escribió: "como parte del nuevo mensaje. Parece que la única solución puede ser simplemente aprender cómo responde cada cliente (gmail, outlook, etc.). –

+0

Postularía que la mayoría de los proveedores siempre pondrían esto en una nueva línea. ¿No puedes hacer la diferencia que borrar la línea entre el último salto de línea y el penúltimo? Entonces, su ejemplo, ¿es realmente multilínea o simplemente cómo se pegó? – FlavorScape

+0

En realidad es multilínea en el ejemplo que publiqué. Mis usuarios también tienen la costumbre de no preservar la nueva línea entre su mensaje y la línea del proveedor. Creo que puedo pensar en un par de heurísticas mientras reúno las cadenas del "mensaje original" de cada cliente ... –

3

Hay un módulo de NPM llamada emailreplyparser, que es portado de una biblioteca github rubí, que hace esto. Como usted señala, los formatos utilizados para esto no son estándar y, por lo tanto, cualquier solución va a ser bastante frágil e imperfecta, pero whaddayagonnado?

Aquí hay un ejemplo en el que tomo una respuesta JSON que obtuve de la nueva API de Gmail y accedo con éxito solo al nuevo texto de respuesta de un mensaje dado.

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: puede haber varios fragmentos interesantes si el autor entrelazó el texto de respuesta y los fragmentos de mensajes entrecomillados.

0

favor compruebe mi código creo que cubre todos los casos como el repositorio contiene cajas trasladadas ONU si hay más de una respuesta en el mensaje y el (En < Fecha> < Correo electrónico> escribió línea de fractura es :) entre más de una línea que funcione mal e incluir esta línea (On < Fecha> < Correo electrónico> escribió :) con él como parte de la respuesta

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; 
} 
Cuestiones relacionadas