Gmail API-使用“原始”输出并解码为utf-8

时间:2019-03-04 10:35:46

标签: python python-3.x gmail-api

使用Gmail API阅读电子邮件时,某些编码存在问题。 首先,我使用以下方法检索电子邮件:

message = service.users().messages().get(userId='me', id='169481bce75af185', format='raw').execute()

之后,我使用这些行从中获取字符串并将其转换为mime消息:

msg_str = str(base64.urlsafe_b64decode(message['raw'].encode('utf-8')).decode('utf-8'))
mime_msg = email.message_from_string(msg_str)

然后我打印出我得到的东西:

print(mime_msg.get_payload()[0])

但是我可以在输出中看到一些奇怪的字符,例如:

Gesch=C3=A4ftsf=C3=BChrer

在邮件标题中,我可以看到:

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

我做错了什么,如何在没有奇怪字符的情况下获得正确的输出?

谢谢您的时间

2 个答案:

答案 0 :(得分:2)

您的数据已被编码为UTF-8,然后通过进一步编码为quoted-printable来确保7位传输的安全性。这就是消息头告诉您的内容。使用quopri撤消quoted-printable,然后使用.decode获得Unicode:

>>> import quopri
>>> print(quopri.decodestring("Gesch=C3=A4ftsf=C3=BChrer").decode("utf-8"))
Geschäftsführer

答案 1 :(得分:2)

如BoarGules所建议,它现在可以正确显示字符。浏览此站点也使我有了这个有用的功能:

def decode_email(msg_str):
    p = Parser()
    message = p.parsestr(msg_str)
    decoded_message = ''
    for part in message.walk():
        charset = part.get_content_charset()
        if part.get_content_type() == 'text/plain':
            part_str = part.get_payload(decode=1)
            decoded_message += part_str.decode(charset)
    return decoded_message

将消息字符串转换为解码后的字符串,以正确显示字符。