gmailapi使用“raw”输出看到奇怪的德语字符并解码成utf8

2024-04-20 11:03:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用gmailapi阅读电子邮件时遇到了一些编码问题。 首先,我使用以下方法检索电子邮件:

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

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

谢谢你抽出时间


Tags: 方法消息message编码getraw电子邮件msg
2条回答

您的数据已被编码为UTF-8,然后通过进一步编码(引用为printable)来确保7位传输的安全。这就是消息头告诉你的。使用quopri撤消引用的可打印文件,然后使用.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

它将消息字符串转换为解码字符串并正确显示字符。你知道吗

相关问题 更多 >