2017-04-21 77 views
0

我正在用Python中的GMail API檢索用法語寫的郵件,而且我實際上遇到了重音問題。來自任何地方的GMail API解碼消息

檢索到的信息與此:

message = service.users().messages().get(userId="me", id=i, format="raw").execute() 

所有我想要的是收郵件的身體,所以我開始與此:

base64.urlsafe_b64decode(message['raw'].encode('ASCII')) 

對於一些郵件,它的工作原理,我檢索所有的郵件數據,包括法文文本,例如:

"Cette semaine, vous vous êtes servis du module de révision 0 fois" 

對於其他人,我得到quoted-print編碼,lik E本:

"Salut, =E7a farte?" 

引用可打印的編碼是沒有問題,因爲我已經建立了使用quopri模塊的簡單解碼功能。這裏的主要問題是,最後一句是錯誤的引述打印編碼,該編碼的字符是ç,應該像這樣編碼:

"Salut, =C3=A7a farte?" 

所以用錯編碼的句子,我最終了這種的東西:

Salut, �a farte? 

我懷疑原點是所述不同的郵件客戶端,我的第一爲例是從Gmail客戶端發送到Outlook地址和第二個例子中是相反的消息; Outlook郵件地址。

我的問題是,有沒有辦法解碼任何可能的情況?

回答

2

的問題是,雖然quopri正確地從7位數據轉換郵件正文爲8位數據,編碼,你再使用這個字節字符串轉換成Unicode字符串是不正確的。在你的榜樣,它似乎是ISO-8859-1:

In [1]: import quopri 

In [2]: quopri.decodestring('Salut, =E7a farte?').decode('iso-8859-1') 
Out[2]: 'Salut, ça farte?' 

通常你應該能夠使用Content-Type頭,以獲得正確的編碼。這是郵件中使用帶引號的可打印UTF-8編碼的外觀:

Content-Type: text/plain;charset=UTF-8 
Content-Transfer-Encoding: quoted-printable 
0

試試這個:

message = service.users().messages().get(userId='me', id=i).execute() 
content = message['payload']['body']['data'] 
print(base64.b64decode(content).decode('utf-8')) 

這將讓電子郵件的內容。