2015-02-26 1 views
0

Voici mon code:Utiliser imaplib pour obtenir des en-têtes d'e-mails?

conn = imaplib.IMAP4_SSL('imap.gmail.com') 
    conn.login('username', 'password') 
    conn.select() 
    typ, data = conn.search(None, "ALL") 
    parser1 = HeaderParser() 
    for num in data[0].split(): 
     typ, data = conn.fetch(num, '(RFC822)') 
     header_data = str(data[1][0]) 
     msg = email.message_from_string(header_data) 
     print(msg.keys()) 
     print(msg['Date']) 

Pourquoi suis-je obtenir "[]" pour l'impression de msg.keys() et "Aucun" pour le msg [ 'Date']. Aucun message d'erreur Cependant, si je commente les 4 dernières lignes de code et tape print (data), alors tous les en-têtes sont imprimés? Im en utilisant python 3.4

Répondre

0

conn.fetch renvoie tuples of message part envelope and data. Pour une raison quelconque - je ne sais pas pourquoi - il peut également retourner une chaîne, comme ')'. Ainsi, au lieu de coder en dur data[1][0], il est préférable (plus robuste) juste boucle à travers les tuples dans data et analyser les parties du message:

typ, msg_data = conn.fetch(num, '(RFC822)') 
for response_part in msg_data: 
    if isinstance(response_part, tuple): 
     msg = email.message_from_string(response_part[1]) 

Par exemple,

import imaplib 
import config 
import email 

conn = imaplib.IMAP4_SSL("imap.gmail.com", 993) 
conn.login(config.GMAIL_USER2, config.GMAIL_PASS2) 
try: 
    conn.select() 

    typ, data = conn.search(None, "ALL") 
    print(data) 
    for num in data[0].split(): 
     typ, msg_data = conn.fetch(num, '(RFC822)') 
     for response_part in msg_data: 
      if isinstance(response_part, tuple): 
       part = response_part[1].decode('utf-8') 
       msg = email.message_from_string(part) 
       print(msg.keys()) 
       print(msg['Date']) 
finally: 
    try: 
     conn.close() 
    except: 
     pass 
    finally: 
     conn.logout() 

Une grande partie de ce code provient de Doug Hellman's imaplib tutorial.

+0

Je viens d'essayer cela et je n'ai pas eu de message d'erreur. Mais rien du tout imprime. Je reviendrai dessus juste pour être sûr que –

+0

Si vous exécutez le code que j'ai posté et que * rien * s'imprime, alors 'data' est une chaîne vide car il y a un' print (data) 'dedans. – unutbu

+0

TypeError: initial_value doit être str ou None, pas bytes est le message d'erreur que j'obtiens –