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