Saltar al contenido

Python: cómo analizar el cuerpo de un correo electrónico sin procesar, dado que el correo electrónico sin procesar no tiene una etiqueta de “Cuerpo” ni nada

Te sugerimos que revises esta resolución en un ambiente controlado antes de pasarlo a producción, un saludo.

Solución:

Para ser muy positivo, trabaja con el cuerpo real del correo electrónico (sin embargo, aún con la posibilidad de que no esté analizando la parte correcta), debe omitir los archivos adjuntos y concentrarse en la parte simple o html (según sus necesidades) para obtener más información. Procesando.

Como los archivos adjuntos mencionados anteriormente pueden ser y muy a menudo son parte de texto/sin formato o texto/html, esta muestra no a prueba de viñetas los omite al verificar el encabezado de disposición de contenido:

b = email.message_from_string(a)
body = ""

if b.is_multipart():
    for part in b.walk():
        ctype = part.get_content_type()
        cdispo = str(part.get('Content-Disposition'))

        # skip any text/plain (txt) attachments
        if ctype == 'text/plain' and 'attachment' not in cdispo:
            body = part.get_payload(decode=True)  # decode
            break
# not multipart - i.e. plain text, no attachments, keeping fingers crossed
else:
    body = b.get_payload(decode=True)

POR CIERTO, walk() itera maravillosamente en partes mímicas, y get_payload(decode=True) hace el trabajo sucio de decodificar base64, etc. por usted.

Algunos antecedentes: como insinué, el maravilloso mundo de los correos electrónicos MIME presenta muchas trampas de encontrar “erróneamente” el cuerpo del mensaje. En el caso más simple, está en la única parte de “texto/simple” y get_payload() es muy tentador, pero no vivimos en un mundo simple; a menudo está rodeado de varias partes/alternativas, relacionadas, mixed etc contenido. Wikipedia lo describe con precisión: MIME, pero considerando que todos estos casos a continuación son válidos y comunes, uno debe considerar las redes de seguridad en todo:

Muy común: más o menos lo que obtienes en el editor normal (Gmail, Outlook) al enviar texto formateado con un archivo adjunto:

multipart/mixed
 |
 +- multipart/related
 |   |
 |   +- multipart/alternative
 |   |   |
 |   |   +- text/plain
 |   |   +- text/html
 |   |      
 |   +- image/png
 |
 +-- application/msexcel

Relativamente simple – solo representación alternativa:

multipart/alternative
 |
 +- text/plain
 +- text/html

Para bien o para mal, esta estructura también es válida:

multipart/alternative
 |
 +- text/plain
 +- multipart/related
      |
      +- text/html
      +- image/jpeg

Espero que esto ayude un poco.

PD: Mi punto es que no te acerques al correo electrónico a la ligera: muerde cuando menos lo esperas 🙂

Utilice Message.get_payload

b = email.message_from_string(a)
if b.is_multipart():
    for payload in b.get_payload():
        # if payload.is_multipart(): ...
        print payload.get_payload()
else:
    print b.get_payload()

Hay muy buen paquete disponible para analizar el contenido del correo electrónico con la documentación adecuada.

import mailparser

mail = mailparser.parse_from_file(f)
mail = mailparser.parse_from_file_obj(fp)
mail = mailparser.parse_from_string(raw_mail)
mail = mailparser.parse_from_bytes(byte_mail)

Cómo utilizar:

mail.attachments: list of all attachments
mail.body
mail.to

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *