【问题标题】:How to read emails with utf8 characters using imaplib [duplicate]如何使用 imaplib 阅读带有 utf8 字符的电子邮件 [重复]
【发布时间】:2022-01-17 00:01:32
【问题描述】:

我正在尝试使用 imaplib 阅读电子邮件,但由于某种原因,utf8 字符显示不正确。例如邮箱:soporte técnico 结果:soporte t=C3=A9cnico

import imaplib

mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('email@gmail.com', 'pass')
mail.select('inbox')
res, mailList = mail.search(None, "FROM", "noreply@test.com")
for x in reversed(mailList[0].split()):
    typ, dataMail = mail.fetch(str(int(x)), '(RFC822)')
    print(dataMail[0][1].decode("utf8"))

如何才能正确阅读带有 utf8 字符的电子邮件?谢谢

【问题讨论】:

  • 它可能不是 UTF-8 编码的消息。检查电子邮件的标题是否有内容编码。
  • 您有一个带有Q encoding 或实际quoted-printable encoding 的值(Q 编码用于消息标头,在消息正文中引用-可打印,检查 Content-Transfer-Encoding 标头)- 那里处理这些编码的辅助函数,寻找它们。
  • @Tomalak 谢谢你的回复。我曾尝试使用模块 quopri 解码电子邮件,但现在它返回给我这个:M\xc3\xa1s informaci\xc3\xb3n en from Más información en 如果我尝试解码为 utf8,它会显示此错误:'utf-8' codec can't解码位置 1095 中的字节 0xee:无效的继续字节
  • 重复的question的题目大相径庭,但答案是一样的。

标签: python email imap


【解决方案1】:

让它像这样工作:

import imaplib
import email
import email.policy

mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('email@gmail.com', 'pass')
mail.select('inbox')
res, mailList = mail.search(None, "FROM", "noreply@test.com")
for x in reversed(mailList[0].split()):
    typ, dataMail = mail.fetch(str(int(x)), '(RFC822)')
    msg = email.message_from_bytes(dataMail[0][1], policy=email.policy.default)
    
    #get the body of the email
    body = ""
    for part in msg.walk():
        charset = part.get_content_charset()
        if part.get_content_type() == "text/plain":
            partStr = part.get_payload(decode=True)
            body += partStr.decode(charset)

    print(body)

【讨论】:

  • message_from_string 在这里是错误的;只是不要尝试解码bytes - 而是将它们传递给message_from_bytes
  • 另外,您想使用现代的email API,它(很麻烦)需要一个email.policy 参数。
猜你喜欢
  • 2019-04-25
  • 2014-10-16
  • 2021-12-30
  • 2014-02-06
  • 2014-10-03
  • 1970-01-01
  • 2021-06-16
  • 2021-11-01
  • 2018-05-11
相关资源
最近更新 更多