Analizar el cuerpo de una gran cantidad de correos electrónicos

Estoy buscando un software del lado del servidor para analizar una gran cantidad de correos electrónicos y extraer la firma del correo electrónico. Muy específicamente, quiero ingresar el cuerpo de un mensaje de correo, identificar la firma y extraer los datos.

La característica más importante es el reconocimiento de patrones bien escrito. De hecho, estaría feliz con un analizador de texto, ya que me siento cómodo proporcionando solo el cuerpo como una cadena grande.

No me importa el idioma.

Respuestas (1)

Puede hacer esto de manera muy simple, ya sea del lado del cliente o del servidor, utilizando algunas secuencias de comandos de Python .

Python, usando solo las bibliotecas integradas, puede:

  • Conéctese como un cliente de correo electrónico para descargar los correos electrónicos,
  • Busque cada cuerpo de correo electrónico para obtener cualquier firma de texto (todas las firmas válidas comienzan con una línea con solo dos guiones seguidos de una línea "-- \n" pero hay algunos otros formatos para buscar), la biblioteca de expresiones regulares de python es especialmente bien por esto
  • Python también puede manejar firmas basadas en imágenes o html con facilidad utilizando solo las bibliotecas estándar.
  • Las firmas vCard , ( RFC 2426 ), se pueden manejar con la biblioteca de complementos vcard ,
  • Muchos servidores, especialmente los basados ​​en Linux, ya tienen Python instalado, por lo que si tiene acceso al servidor, también puede hacerlo con Python, pero la forma de acceder al contenido del correo electrónico en el servidor depende del servidor de correo que esté ejecutando.

Desafortunadamente, hay varias formas inconsistentes de denotar una firma: Mi firma producida por Thunderbird, Outlook, etc.:

-- 
Steve (Gadget) Barnes
Any opinions in this message are my personal opinions and do not reflect those of my employer.

Tenga en cuenta la línea que contiene solo guión, guión, espacio: este es el "estándar", pero algunos otros clientes adjuntan archivos, imágenes, montones de html, etc. Del mismo modo, las convenciones con respecto a la publicación superior, inferior o intercalada de contenido nuevo en un correo electrónico intercambio son en gran medida una cuestión de convención y el marcado del texto recibido previamente mediante sangría o prefijando cada línea del mensaje anterior con > otros caracteres depende nuevamente tanto del cliente de correo electrónico como, a menudo, de la configuración de los usuarios.

Sugeriría usar un método de búsqueda incremental donde, posiblemente, intente buscar:

  1. -- \nseguido de una o más líneas que no estén en blanco. f1=re.compile(r'^-- \n(.+)', flags=re.MULTILINE+re.DOTALL)debería hacerlo bien.
  2. si no lo encuentra, puede buscar líneas que comiencen con cualquiera de Tel ephone : , Web site : , Mob ile : , etc. y busque las líneas contiguas, es decir, sin líneas en blanco , encima de ellas.
  3. También puede buscar secciones de texto que comiencen con Atentamente, Atentamente, Saludos cordiales y otras despedidas (hay una lista en el enlace).

Mientras trabaja en el desarrollo de su conjunto de expresiones regulares, le recomiendo enfáticamente que use un verificador de expresiones regulares de python como pythex .

Por supuesto, esto se complica por la posibilidad de adjuntar una vCard, el escaneo de una firma, etc. y por el hecho de que cualquier mensaje dado puede ser texto sin formato, html o ambos y, lo que es más molesto, algunas personas simplemente envían una palabra, u otro, documento como un correo electrónico .

Hasta donde yo sé, no existe una biblioteca actual que cubra todas estas posibilidades, posiblemente podría contribuir con una en el momento.

Gracias por esto. muy claro ¿Puede explicar un poco lo que quiere decir con "-- \n", tal vez si tiene un ejemplo? Además, cuando dice que hay otros formatos para buscar, ¿hay una lista completa en alguna parte o una biblioteca de Python que ya haya implementado muchos de esos formatos?
@Mika He ampliado la respuesta anterior para dar algunos ejemplos.