繁体   English   中英

GMail API解码来自各地的消息

[英]GMail API decoding messages from everywhere

我正在使用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邮件。

我的问题是,是否有一种方法可以处理任何可能的情况?

问题是,虽然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

尝试这个:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM