来自世界各地的GMail API解码消息

时间:2017-04-21 08:14:25

标签: python encoding gmail gmail-api quoted-printable

我正在使用Python中的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"

对于其他一些人,我得到引用打印编码,如下所示:

"Salut, =E7a farte?"

引用打印编码没有问题,因为我使用quopri模块构建了一个简单的解码函数。这里的主要问题是,引用打印编码的最后一个句子是错误的,编码字符是ç,应该像这样编码:

"Salut, =C3=A7a farte?"

所以使用错误的编码句子,我最终得到了这样的东西:

Salut, �a farte?

我怀疑原点是不同的邮件客户端,我的第一个例子是从Gmail客户端发送到Outlook地址的邮件,第二个例子是相反的;到Gmail地址的Outlook消息。

我的问题是,有没有办法处理任何可能情况的解码?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

试试这个:

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

这将获得电子邮件的内容。