2013-07-26 9 views
39

Sembra facile ottenere ilPython: come analizzare il corpo da una e-mail prima, dato che la posta elettronica prime non dispone di un tag "corpo" o qualcosa

From 
To 
Subject 

ecc via

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

supponendo che "a" sia la stringa di posta elettronica non elaborata che assomiglia a questo.

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 [email protected]) 
    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: <[email protected]> 
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 QUESTIONE

come si fa a ottenere il Body di questa email tramite Python?

Finora questo è l'unico codice di cui sono a conoscenza ma devo ancora verificarlo.

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

è questo il modo corretto?

o forse c'è qualcosa di più semplice come ...

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

?

risposta

50

Usa 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() 
+0

@GagandeepSingh, grazie per il corretto. – falsetru

+1

Ad ogni modo per farlo visualizzare in testo semplice decodificato? –

+1

Nevermind! Mi sono reso conto che potevo semplicemente usare la libreria base64 e fare un base64.b64decode() –

4

Non c'è b['body'] in python. Devi usare 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... 

Buona fortuna.

39

Per essere estremamente positivo, si lavora con il corpo dell'e-mail effettivo (tuttavia, con la possibilità che non si stia analizzando la parte giusta), è necessario saltare gli allegati e concentrarsi sulla parte normale o html (a seconda del proprio esigenze) per ulteriori elaborazioni.

Come gli attacchi prima citati possono e spesso sono di text/plain o text/parte html, questo campione a prova di non-proiettile salta quelli controllando l'intestazione 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) 

BTW , walk() iterates meravigliosamente su parti mime, e get_payload(decode=True) fa il lavoro sporco sulla decodifica base64 ecc. Per voi.

Un po 'di sfondo - come ho suggerito, il meraviglioso mondo delle e-mail MIME presenta molte insidie ​​di "erroneamente" trovare il corpo del messaggio. Nel caso più semplice è nella sola parte "text/plain" e get_payload() è molto allettante, ma non viviamo in un mondo semplice - è spesso circondato da contenuti multipart/alternativi, correlati, misti, ecc.Wikipedia lo descrive rigorosamente - MIME, ma considerando tutti questi casi sono validi - e comune - bisogna considerare le reti di sicurezza tutt'intorno:

Molto comune - praticamente quello che si ottiene nell'editor normale (Gmail, Outlook) che invia formattato il testo con un allegato:

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

relativamente semplice - basta rappresentazione alternativa:

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

Nel bene e nel male, questa struttura è anche valida:

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

Spero che questo aiuti un po '.

P.S. Il mio punto è non avvicinare la posta elettronica alla leggera - morde quando meno te lo aspetti :)

+3

Grazie per questo esauriente esempio e per la precisazione di un avviso, in contrasto con la risposta accettata. Penso che questo sia un approccio molto migliore/più sicuro. –