2013-10-22 15 views
11

quindi sto provando a scrivere uno script in python che si collega al mio account Gmail e poi mi dice, presto in una GUI, qual è il messaggio. Farò un po 'più di cose al codice in seguito per renderlo un po' più utile, ma al momento sono bloccato solo a poter analizzare le informazioni non elaborate che sto ottenendo. Qui è il mio codice:Python Email Parsing Edizione

#Read Email Script 
import imaplib 
import email 

mail = imaplib.IMAP4_SSL('imap.gmail.com') 
mail.login('[email protected]', 'passwordgoeshere') 
mail.list() 
mail.select("INBOX") # connect to inbox. 


result, data = mail.search(None, "ALL") 

ids = data[0] 
id_list = ids.split() 
latest_email_id = id_list[-1] 

result, data = mail.fetch(latest_email_id, '(RFC822)') 

raw_email = data[0][1] 

email_message = email.message_from_string(raw_email) 

print (email_message['Subject']) 

Ora questo dovrebbe fondamentalmente per cercare di leggere il soggetto delle ultime e-mail che è stato consegnato alla mia casella di posta. Tuttavia ottengo il seguente messaggio di errore nella console:

>>> 
Traceback (most recent call last): 
    File "C:/Users/Dhruvin Desai/Documents/Python/script.py", line 21, in <module> 
    email_message = email.message_from_string(raw_email) 
    File "C:\Python33\lib\email\__init__.py", line 40, in message_from_string 
    return Parser(*args, **kws).parsestr(s) 
    File "C:\Python33\lib\email\parser.py", line 69, in parsestr 
    return self.parse(StringIO(text), headersonly=headersonly) 
TypeError: initial_value must be str or None, not bytes 
>>> 

Non so perché questo sta arrivando, ma fin dalla sua mi dice che il valore di email_message deve essere in formato stringa, ho provato questo:

email_message = email.message_from_string(str(raw_email)) 

Ma il risultato dopo aver eseguito l'intero script con quel cambiamento sempre, non importa cosa, ha provocato la console dicendo None

non so cosa fare, si prega di aiuto.

risposta

28

Poiché si utilizza python3, invece di utilizzare

email.message_from_string(raw_email) 

Usa

email.message_from_bytes(raw_email) 
+0

Tale piccolo cambiamento fatto una differenza enorme. Grazie mille per l'aiuto! – bloodstorm17

+0

@ bloodstorm17 C'è una cosa che ho dimenticato di menzionare. Il contenuto ottenuto da Gmail è codificato con base64, è necessario decodificarlo per ottenere il soggetto reale –