【问题标题】:Python imaplib: Display non-ASCII characters correctlyPython imaplib:正确显示非 ASCII 字符
【发布时间】:2019-05-21 03:58:08
【问题描述】:

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

给予

>> ... Mit freundlichen Gr=C3=BC=C3=9Fen ...

而不是想要的

>> ... Mit freundlichen Grüßen ...

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

【问题讨论】:

  • 如果您使用的是 python3.6 或更高版本,您可以使用 EmailMessage.get_content() 自动解码带引号的可打印文本。有关重复的目标问题,请参阅 my answer

标签: python python-3.x character-encoding email non-ascii-characters


【解决方案1】:

文本用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

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

【讨论】:

  • 当你得到有效载荷时,Python 应该已经在解码了。也许它是由发件人双重编码的?
  • 添加消息样本(理想情况下,减少到几行,足以看到基本标题和一行编码文本)将有助于我们最终调试。
  • @tripleee in 3.6+ EmailMessage.get_content() 将自动解码quoted-printable - 我为你的欺骗目标添加了一个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多