2016-02-28 3 views
1

PYTHON VERSION == 3.5contenu e-mail d'analyse syntaxique de poplib avec module de courrier électronique (PYTHON)

Code:

import getpass, poplib, email 
Mailbox = poplib.POP3_SSL('pop.googlemail.com', '995') 
Mailbox.user("[email protected]") 
Mailbox.pass_('password_here') 
numMessages = len(Mailbox.list()[1]) 
for i in range(numMessages): 
    info = b" ".join(Mailbox.retr(i+1)[1]) 
    msg = email.message_from_bytes(info) 
    print(msg.keys()) 

sortie:

['MIME-Version'] 
['MIME-Version'] 
['MIME-Version'] 
['Delivered-To'] 
['Delivered-To'] 
['Delivered-To'] 
['Delivered-To'] 
['Delivered-To'] 
['Delivered-To'] 
['Delivered-To'] 
['Delivered-To'] 

la sortie n'est pas correcte car il devrait y avoir plus de champs du msg autre que "MIME-Version" et "Delivered-To" I tho ught

email.message_from_bytes() parse le contenu d'une chaîne d'octets

est msg pas une chaîne d'octets?

le docs recommande ceci:

M = poplib.POP3('localhost') 
M.user(getpass.getuser()) 
M.pass_(getpass.getpass()) 
numMessages = len(M.list()[1]) 
for i in range(numMessages): 
    for j in M.retr(i+1)[1]: 
     print(j) 

est-il un moyen d'analyser le message renvoyé à l'aide du module e-mail? afin que nous puissions stocker les détails de l'e-mail. comme l'expéditeur, le corps, en-tête, etc.

Répondre

1

la réponse est avéré être assez facile

import getpass, poplib, email 
Mailbox = poplib.POP3_SSL('pop.googlemail.com', '995') 
Mailbox.user("[email protected]") 
Mailbox.pass_('password_here') 
numMessages = len(Mailbox.list()[1]) 
for i in range(numMessages): 
    raw_email = b"\n".join(Mailbox.retr(i+1)[1]) 
    parsed_email = email.message_from_bytes(raw_email) 
    print(parsed_email.keys()) 

au lieu de se joindre à raw_email avec un espace juste rejoindre par un \n et le module email peut analyser correctement les champs:

également une chose impressionnante sur l'utilisation du module email est lorsque vous appelez email.message_from_bytes() la sortie est retourné un dict

de sorte que vous accédez aux champs comme ceci:

raw_email = b"\n".join(Mailbox.retr(i+1)[1]) 
parsed_email = email.message_from_bytes(raw_email) 
print(parsed_email["header"]) 

mais si le champ n'existe pas ?:

raw_email = b"\n".join(Mailbox.retr(i+1)[1]) 
parsed_email = email.message_from_bytes(raw_email) 
print(parsed_email["non-existent field"]) 

le code ci-dessus retournera None et ne pas jeter un KeyError