2010-03-05 32 views
13

estoy de análisis de mensajes de correo electrónico. Cuando veo una respuesta a un correo electrónico, me gustaría eliminar el texto citado para que pueda anexar el texto al correo electrónico anterior (incluso si es una respuesta).Cómo eliminar el texto citado de un correo electrónico y sólo muestra el nuevo texto

Por lo general, verá esto:

primera correo electrónico (inicio de la conversación)

This is the first email 

segundo correo electrónico (respuesta a la primera)

This is the second email 

Tim said: 
This is the first email 

La salida de esto sería "Este es el segundo correo electrónico" solamente. Aunque los diferentes clientes de correo electrónico citan texto de manera diferente, si hubiera alguna forma de obtener principalmente el nuevo texto de correo electrónico, eso también sería aceptable.

Respuesta

2

Cuando los correos electrónicos anteriores se almacenan en el disco, o somwhow disponibles, se puede comprobar todos los correos, enviar por un receptor específico para determinar, que es el texto de respuesta.

También podría tratar de determinar el carácter de comillas, comprobando el primer carácter de las últimas líneas. Normalmente, las últimas líneas siempre comienzan con el mismo personaje.

Cuando las 2 últimas líneas que comienzan con un carácter ifferent, youcould tratar las primeras líneas, porque a veces la respuesta se añade atthe final del texto.

Si ha detectado estos caracteres, se podría eliminar las últimas líneas que están empezando con este personaje hasta una línea vacía o una línea de salida se detecta con otro personaje.

no han sido evaluados y es más como pseudo código

String[] lines; 

    // Check the size of the array first, length > 2 
    char startingChar = lines[lines.length - 1].charAt(0); 
    int foundCounter = 0; 
    for (int i = lines.length - 2; i >=0; --i) { 
     String line = lines[i]; 

     // Check line size > 0 
     if(startingChar == line.charAt(0)){ 
      ++foundCounter; 
     } 
    } 

    final int YOUR_DECISION = 2; // You can decide 
    if(foundCounter > YOUR_DECISION){ 
     deleteLastLinesHere(startingChar, foundCounter); 
    } 
+1

'char startingChar = lines [lines.length - 1];' no se compilará. ¿Querías decir 'char startingChar = lines [lines.length - 1] .charAt (0);'? – sfussenegger

+1

sí, lo siento. Como dije, esto es más como un pseudo código;). Actualizaré la respuesta –

1

De la observación de la conducta del Gmail en este sentido he observado su estrategia:

  1. escribir la segunda electrónico completo.
  2. Anexar texto como: En [fecha y hora], [nombre del remitente de correo electrónico] < [primer correo electrónico del remitente dirección de correo electrónico]> escribió:
  3. Anexar el primer correo electrónico completa. a. Si su correo electrónico está en texto plano, agregue '>' antes de cada línea del primer correo electrónico. b. Si está en HTML, entonces Gmail da un margen lateral izquierdo como:

    border-left: #CCC sólido 1px; margen: 0px 0px 0px 0.8ex; relleno a la izquierda: 1ex; usuario del agente de estilos blockquote

    y luego se añade el texto del primer correo electrónico.

Puede realizar una ingeniería inversa al analizar los correos electrónicos desde la dirección de Gmail. No he investigado a otros clientes, pero deberían tener el mismo comportamiento.

1

Obtendrá casi derecha con un par de líneas de código:

String newMessage = ""; 
for (String line : emailLines) { 
    if (!line.matches("^[>].*")) { 
    newMessage = newMessage.concat(line); 
    } 
} 

Si es necesario, se podría añadir otros controles de expresiones regulares para los clientes de correo electrónico que dejan diferentes firmas texto citado.

+0

Me gusta el enfoque simplista. –

12

que utilizar la siguiente expresión regular (s) para que coincida con el plomo en para el texto citado (la última es la que cuenta):

/** general spacers for time and date */ 
    private static final String spacers = "[\\s,/\\.\\-]"; 

    /** matches times */ 
    private static final String timePattern = "(?:[0-2])?[0-9]:[0-5][0-9](?::[0-5][0-9])?(?:(?:\\s)?[AP]M)?"; 

    /** matches day of the week */ 
    private static final String dayPattern = "(?:(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)|(?:Sun(?:day)?))"; 

    /** matches day of the month (number and st, nd, rd, th) */ 
    private static final String dayOfMonthPattern = "[0-3]?[0-9]" + spacers + "*(?:(?:th)|(?:st)|(?:nd)|(?:rd))?"; 

    /** matches months (numeric and text) */ 
    private static final String monthPattern = "(?:(?:Jan(?:uary)?)|(?:Feb(?:uary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|(?:May)|(?:Jun(?:e)?)|(?:Jul(?:y)?)" + 
               "|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)|(?:[0-1]?[0-9]))"; 

    /** matches years (only 1000's and 2000's, because we are matching emails) */ 
    private static final String yearPattern = "(?:[1-2]?[0-9])[0-9][0-9]"; 

    /** matches a full date */ 
    private static final String datePattern  = "(?:" + dayPattern + spacers + "+)?(?:(?:" + dayOfMonthPattern + spacers + "+" + monthPattern + ")|" + 
               "(?:" + monthPattern + spacers + "+" + dayOfMonthPattern + "))" + 
               spacers + "+" + yearPattern; 

    /** matches a date and time combo (in either order) */ 
    private static final String dateTimePattern = "(?:" + datePattern + "[\\s,]*(?:(?:at)|(?:@))?\\s*" + timePattern + ")|" + 
               "(?:" + timePattern + "[\\s,]*(?:on)?\\s*"+ datePattern + ")"; 

    /** matches a leading line such as 
    * ----Original Message---- 
    * or simply 
    * ------------------------ 
    */ 
    private static final String leadInLine = "-+\\s*(?:Original(?:\\sMessage)?)?\\s*-+\n"; 

    /** matches a header line indicating the date */ 
    private static final String dateLine = "(?:(?:date)|(?:sent)|(?:time)):\\s*"+ dateTimePattern + ".*\n"; 

    /** matches a subject or address line */ 
    private static final String subjectOrAddressLine = "((?:from)|(?:subject)|(?:b?cc)|(?:to))|:.*\n"; 

    /** matches gmail style quoted text beginning, i.e. 
    * On Mon Jun 7, 2010 at 8:50 PM, Simon wrote: 
    */ 
    private static final String gmailQuotedTextBeginning = "(On\\s+" + dateTimePattern + ".*wrote:\n)"; 


    /** matches the start of a quoted section of an email */ 
    private static final Pattern QUOTED_TEXT_BEGINNING = Pattern.compile("(?i)(?:(?:" + leadInLine + ")?" + 
                     "(?:(?:" +subjectOrAddressLine + ")|(?:" + dateLine + ")){2,6})|(?:" + 
                     gmailQuotedTextBeginning + ")" 
                    ); 

Yo sé que de alguna manera esto es una exageración (y podría ¡sea lento!) pero funciona bastante bien. ¡Por favor, avíseme si encuentra algo que no coincida con esto para que pueda mejorarlo!

+1

¿Cuál es la importancia de {2,6} en el QUOTED_TEXT_BEGINNING? ¿Puedes dar un ejemplo que coincida? – Divij

+1

@Divij requiere que haya al menos 2 y no más de 6 líneas del conjunto de: asunto, a, desde, bcc, cc, fecha. Se vería un mínimo y un sujeto, como máximo, todos 6. Parecían ocurrir en cualquier orden, así que mantuve el orden suelto, pero quise atarlo por motivos de calidad y rendimiento. – smurthas

+0

Gracias por su respuesta, estamos muy llenos para nosotros. pero, este patrón no es o para la siguiente línea "El 16-09-2014, Indies Services Test escribió:" proporcione la solución lo antes posible –

2

RegEx funciona bien, excepto que coincide con el texto que se inicia desde Asunto e ignora todo lo que ocurre antes de "Asunto"

Text 
-------- Original Message -------- 
<TABLE border="0" cellpadding="0" cellspacing="0"> 
    <TBODY> 
    <TR> 
     <TH align="right" valign="baseline"> 
     // the matcher starts working from here 
5

Mira la patente de Google en esto: http://www.google.com/patents/US7222299

En resumen se picadillo porciones de el texto (presumiblemente algo así como oraciones) y luego busca coincidencias con hashes en los mensajes anteriores. Súper rápido y probablemente también lo usen como entrada para el algoritmo de subprocesamiento. ¡Que buena idea!

Cuestiones relacionadas