2017-04-21 119 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')) 

这将让电子邮件的内容。