Python imaplib:正确显示非 ASCII 字符

Eli*_*hle 2 python email character-encoding non-ascii-characters python-3.x

我正在使用 Python 3.5 并imaplib从 GMail 获取电子邮件并打印其正文。正文包含非 ASCII 字符。这些以一种奇怪的方式“编码”,我不知道如何解决这个问题。

import email
import imaplib

c = imaplib.IMAP4_SSL('imap.gmail.com')
c.login('example@gmail.com', 'password')

c.select('Inbox')
_, data = c.fetch(b'12345', '(RFC822)')

mail = data[0][1]
message = email.message_from_bytes(mail)
payload = message.get_payload()

body = mail[0].as_string()
print(body)
Run Code Online (Sandbox Code Playgroud)

>> ... Mit freundlichen Gr=C3=BC=C3=9Fen ...
Run Code Online (Sandbox Code Playgroud)

而不是想要的

>> ... Mit freundlichen Grüßen ...
Run Code Online (Sandbox Code Playgroud)

在我看来,这不是编码问题,而是转换问题。但是我如何告诉 Python 正确转换字符呢?有没有更方便的图书馆?

sna*_*erb 6

文本使用quoted-printable encoding 编码,这是一种在ascii 文本中编码非ascii 字符的方法。您可以使用 python 的quopri模块对其进行解码。

>>> import quopri
>>> bs = b'Gr=C3=BC=C3=9Fen'

>>> # Decode quoted-printable to raw bytes.
>>> utf8 = quopri.decodestring(bs)

>>> # Decode bytes to text.
>>> s = utf8.decode('utf-8')
>>> print(s)
Grüßen
Run Code Online (Sandbox Code Playgroud)

您可能会发现这quoted-printable是电子邮件content-transfer-encoding标题的值。