java email duplicate-data

java - Cómo eliminar el texto entrecomillado de un correo electrónico y solo mostrar el nuevo texto



email duplicate-data (6)

Cuando los correos electrónicos anteriores se almacenan en el disco, o en algún modo disponible, puede verificar todos los correos, enviados por un receptor específico para determinar cuál es el texto de respuesta.

También puede intentar determinar el carácter de comillas, marcando 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 comienzan con un carácter diferente, puede probar las primeras líneas, porque a veces la respuesta se agrega al final del texto.

Si ha detectado estos caracteres, puede eliminar las últimas líneas que comienzan con este carácter hasta que se detecte una línea vacía o una línea que comience con otro carácter.

NO PROBADO y es más como un 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); }

Estoy analizando correos electrónicos. 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).

Por lo general, verá esto:

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

This is the first email

2º correo electrónico (respuesta al primero)

This is the second email Tim said: This is the first email

El resultado 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.


De observar el comportamiento de Gmail en este sentido, he observado su estrategia:

  1. escriba el segundo correo completo.
  2. Agregar texto como: En [indicación de fecha y hora], [nombre del primer remitente de correo electrónico] <[primera dirección de correo electrónico del remitente de correo electrónico]> escribió:
  3. Anexe el primer correo electrónico completo. a. Si su correo electrónico está en texto plano, agregue ''>'' antes de cada línea del primer correo electrónico. segundo. Si está en HTML, Gmail da un margen izquierdo como:

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

    y luego agrega el primer texto del 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.


Lo conseguirás casi bien 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, puede agregar otras comprobaciones de expresiones regulares para los clientes de correo electrónico que dejan diferentes firmas de texto entre comillas.


Uso las siguientes expresiones regulares para hacer coincidir el avance del texto citado (el último es el 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 + ")" );

Sé que de alguna manera esto es excesivo (¡y puede ser lento!) Pero funciona bastante bien. ¡Por favor, avíseme si encuentra algo que no coincida con esto para que pueda mejorarlo!


RegEx funciona bien, excepto que coincide con el texto que comienza desde el Asunto e ignora todo lo que va 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


Consulte la patente de Google en este: http://www.google.com/patents/US7222299

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