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