Gmail API - 使用 'raw' 输出并解码为 utf-8 看到奇怪的德语字符

Gmail API - Seeing strange German characters using 'raw' output and decoding into utf-8

我在使用 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

在消息中header我可以看到这个:

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

我做错了什么,我怎样才能得到没有奇怪字符的正确输出?

感谢您的宝贵时间

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

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

正如 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

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