Obtenga el texto del cuerpo de un correo electrónico utilizando el imap de Python y el paquete de correo electrónico

Quiero recuperar el cuerpo (solo texto) de los correos electrónicos usando el imap de Python y el paquete de correo electrónico.

Según este hilo SO , estoy usando el siguiente código:

mail = email.message_from_string(email_body) bodytext = mail.get_payload()[ 0 ].get_payload() 

Aunque está funcionando bien en algunos casos, pero en algún momento me vuelvo similar a la siguiente respuesta

 [, ] 

Está asumiendo que los mensajes tienen una estructura uniforme, con una “parte principal” bien definida. Ese no es el caso; puede haber mensajes con una sola parte que no es una parte de texto (solo un “archivo adjunto” de un archivo binario, y nada más) o puede ser un multiparte con múltiples partes textuales (o, de nuevo, ninguna) e incluso Si solo hay uno, no es necesario que sea la primera parte. Además, hay varias partes anidadas (una o más partes es otro mensaje MIME, recursivamente).

En tantas palabras, debe inspeccionar la estructura MIME y luego decidir qué partes son relevantes para su aplicación. Si solo recibe mensajes de un pequeño grupo de clientes bastante estático, puede cortar algunas esquinas (al menos hasta la próxima actualización de Microsoft Plague), pero en general, simplemente no existe una jerarquía de ningún tipo, solo una colección de partes (no necesariamente siempre directamente relacionadas) igualmente importantes.

El principal problema en mi caso es que el mensaje respondido o reenviado se muestra como instancia de mensaje en el texto del cuerpo.

Resolví mi problema usando el siguiente código:

 bodytext=mail.get_payload()[0].get_payload(); if type(bodytext) is list: bodytext=','.join(str(v) for v in bodytext) 

Tal vez este post (mío) pueda ser de ayuda. Recibo un boletín con precios de diferentes tipos de petróleo en los Estados Unidos. Obtengo el correo electrónico en gmail con un patrón dado para el título, luego extraigo los precios en el cuerpo del correo usando expresiones regulares. Así que tengo que acceder al cuerpo del correo para los últimos n correos electrónicos cuyo título observa un patrón dado.

Estoy usando email.message_from_string() también: msg = email.message_from_string(response_part[1])

así que tal vez te da un ejemplo concreto de cómo usar los métodos en esta biblioteca de python.

Básicamente, tiene que recorrer en iteración las diferentes partes del mensaje de texto / sin formato (o texto / html) para llegar al cuerpo. ¡No hay ninguna garantía sobre qué posición es la parte del cuerpo! (aunque existe la convención de que sea uno de los primeros … en la mayoría de los casos … probablemente … 🙂

Como no quiero duplicar el contenido, vea mi respuesta a una pregunta bastante similar aquí y ajústela según sus necesidades.