with sent mimemultipart library integrar from con python email python-2.7 mod-wsgi wsgi

sent - send email python 3



Python: cómo analizar el cuerpo de un correo electrónico sin formato, dado que el correo electrónico sin procesar no tiene una etiqueta de "cuerpo" ni nada (4)

Hay un package muy bueno disponible para analizar los contenidos 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

Parece fácil obtener el

From To Subject

etc vía

import email b = email.message_from_string(a) bbb = b[''from''] ccc = b[''to'']

suponiendo que "a" es la cadena de correo electrónico sin formato que se parece a esto.

a = """From [email protected] Thu Jul 25 19:28:59 2013 Received: from a1.local.tld (localhost [127.0.0.1]) by a1.local.tld (8.14.4/8.14.4) with ESMTP id r6Q2SxeQ003866 for <[email protected]>; Thu, 25 Jul 2013 19:28:59 -0700 Received: (from root@localhost) by a1.local.tld (8.14.4/8.14.4/Submit) id r6Q2Sxbh003865; Thu, 25 Jul 2013 19:28:59 -0700 From: [email protected] Subject: oooooooooooooooo To: [email protected] Cc: X-Originating-IP: 192.168.15.127 X-Mailer: Webmin 1.420 Message-Id: <1374805739.3861@a1> Date: Thu, 25 Jul 2013 19:28:59 -0700 (PDT) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="bound1374805739" This is a multi-part message in MIME format. --bound1374805739 Content-Type: text/plain Content-Transfer-Encoding: 7bit ooooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooo --bound1374805739--"""

LA PREGUNTA

¿cómo se obtiene el Body de este correo electrónico a través de python?

Hasta ahora, este es el único código que conozco, pero todavía no lo he probado.

if email.is_multipart(): for part in email.get_payload(): print part.get_payload() else: print email.get_payload()

esta es la forma correcta?

o tal vez hay algo más simple como ...

import email b = email.message_from_string(a) bbb = b[''body'']

?


No hay b[''body''] en python. Tienes que usar get_payload.

if isinstance(mailEntity.get_payload(), list): for eachPayload in mailEntity.get_payload(): ...do things you want... ...real mail body is in eachPayload.get_payload()... else: ...means there is only text/plain part.... ...use mailEntity.get_payload() to get the body...

Buena suerte.


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

Como los archivos adjuntos antes mencionados pueden ser, y muy a menudo son, de partes text / plain o text / html, esta muestra no a prueba de balas los omite al verificar el encabezado content-disposition:

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 las partes de mime, y get_payload(decode=True) hace el trabajo sucio en la decodificación base64 etc. para usted.

Algunos antecedentes: como he sugerido, el maravilloso mundo de los correos electrónicos MIME presenta una gran cantidad de trampas para encontrar "erróneamente" el cuerpo del mensaje. En el caso más simple, está en la única parte "text / plain" y get_payload () es muy tentador, pero no vivimos en un mundo simple: a menudo está rodeado de contenido multipart / alternativo, relacionado, mixto, etc. Wikipedia lo describe con fuerza - MIME , pero considerando que todos estos casos a continuación son válidos - y comunes - uno tiene que considerar las redes de seguridad por todos lados:

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 :)


Use 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()