【问题标题】:Gmail API - Seeing strange German characters using 'raw' output and decoding into utf-8Gmail API - 使用“原始”输出查看奇怪的德语字符并解码为 utf-8
【发布时间】:2019-07-25 15:46:18
【问题描述】:

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

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

感谢您的宝贵时间

【问题讨论】:

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


    【解决方案1】:

    您的数据已被编码为 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
    

    【讨论】:

    • 您好,感谢您的回答。它现在确实正确显示: print(quopri.decodestring(str(mime_msg.get_payload()[0])).decode('utf-8'))
    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 2014-11-19
      相关资源
      最近更新 更多