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
模块构建了一个简单的解码函数。这里的主要问题是最后一句对于quoted-print编码是错误的,编码后的字符是ç
,应该这样编码:
"Salut, =C3=A7a farte?"
所以用错误的编码句子,我最终得到了这种东西:
Salut, �a farte?
我怀疑来源是不同的邮件客户端,我的第一个示例是从 Gmail 客户端发送到 Outlook 地址的邮件,第二个示例则相反;发送到 Gmail 地址的 Outlook 邮件。
我的问题是,有没有办法处理任何可能情况下的解码?
试试这个:
message = service.users().messages().get(userId='me', id=i).execute()
content = message['payload']['body']['data']
print(base64.b64decode(content).decode('utf-8'))
这将获取电子邮件的内容。
问题是,虽然 quopri
正确地将邮件 body 从 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
header 获得正确的编码。这是使用 quoted-printable UTF-8 编码的邮件中的样子:
Content-Type: text/plain;charset=UTF-8
Content-Transfer-Encoding: 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
模块构建了一个简单的解码函数。这里的主要问题是最后一句对于quoted-print编码是错误的,编码后的字符是ç
,应该这样编码:
"Salut, =C3=A7a farte?"
所以用错误的编码句子,我最终得到了这种东西:
Salut, �a farte?
我怀疑来源是不同的邮件客户端,我的第一个示例是从 Gmail 客户端发送到 Outlook 地址的邮件,第二个示例则相反;发送到 Gmail 地址的 Outlook 邮件。
我的问题是,有没有办法处理任何可能情况下的解码?
试试这个:
message = service.users().messages().get(userId='me', id=i).execute()
content = message['payload']['body']['data']
print(base64.b64decode(content).decode('utf-8'))
这将获取电子邮件的内容。
问题是,虽然 quopri
正确地将邮件 body 从 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
header 获得正确的编码。这是使用 quoted-printable UTF-8 编码的邮件中的样子:
Content-Type: text/plain;charset=UTF-8
Content-Transfer-Encoding: quoted-printable