Python IMAP:=?utf-8?Q?在主题字符串中

Python IMAP:=?utf-8?Q?在主题字符串中,python,email,character-encoding,imap,mime,Python,Email,Character Encoding,Imap,Mime,我正在显示带有IMAP的新电子邮件,除了一个邮件主题显示为: =?utf-8?Q?主题?= 如何修复它?在MIME术语中,这些编码块称为编码字。您可以这样解码它们: import email.Header text, encoding = email.Header.decode_header('=?utf-8?Q?Subject?=')[0] 查看文档了解更多详细信息。这是一个MIME。您可以使用以下方法对其进行分析: 试一试 因为imaplib是一个非常过度的低级库,返回的结果很难处理 安装

我正在显示带有
IMAP
的新电子邮件,除了一个邮件主题显示为:

=?utf-8?Q?主题?=


如何修复它?

在MIME术语中,这些编码块称为编码字。您可以这样解码它们:

import email.Header
text, encoding = email.Header.decode_header('=?utf-8?Q?Subject?=')[0]
查看文档了解更多详细信息。

这是一个MIME。您可以使用以下方法对其进行分析:

试一试

因为
imaplib
是一个非常过度的低级库,返回的结果很难处理

安装

pip安装imbox

用法

from imbox import Imbox

with Imbox('imap.gmail.com',
        username='username',
        password='password',
        ssl=True,
        ssl_context=None,
        starttls=False) as imbox:

    all_inbox_messages = imbox.messages()
    for uid, message in all_inbox_messages:
        message.subject

在Python 3.3+中,如果其
policy
参数设置为
policy,则中的解析类和函数将自动解码标题中的“编码字”。默认值

>>> import email
>>> from email import policy

>>> msg = email.message_from_file(open('message.txt'), policy=policy.default)
>>> msg['from']
'Pepé Le Pew <pepe@example.com>'

高级IMAP库在这里可能很有用:

  • 解析的电子邮件属性
  • 用于搜索电子邮件的查询生成器
  • 电子邮件操作:复制、删除、标记、移动、查看
  • 文件夹操作:列表、设置、获取、创建、存在、重命名、删除、状态
  • 无依赖项

在Python 3中,将其解码为近似字符串非常简单:

从email.header导入解码头,生成头
解码=str(生成标题(解码标题(“=?utf-8?Q?主题?=”))

请参阅和的文档。

“我如何修复它?”-为什么您认为它已损坏?它应该只显示“主题”-在=?utf-8?Q?中有什么?在Python2和Python3中,
email.header.decode_header
(小写
m
)是通用名称。此外,在您的代码中,
text
实际上不是一个文本,而是一个字节变量。事实上,imbox能够动态解码其他base64编码(在imaplib等中)的主题和其他字段。但是,请注意,如果某个字段丢失,将抛出KeyError。您可以用更通俗的方式重写它吗?@wbg此代码有什么不通俗的地方?你会改变什么?现在来看,我觉得它写得相当好,是Python表现力的典范。也许是因为Detejan的失误?如果您只是针对Python3,那么可以跳过
If isinstance(word,bytes)else word
前面的
u
;这段代码已经设计成可以在Python2和Python3上工作。
>>> import email
>>> from email import policy

>>> msg = email.message_from_file(open('message.txt'), policy=policy.default)
>>> msg['from']
'Pepé Le Pew <pepe@example.com>'
>>> msg = email.message_from_file(open('message.txt'))
>>> msg['from']
'=?utf-8?q?Pep=C3=A9?= Le Pew <pepe@example.com>'
from imap_tools import MailBox, AND

# get list of email subjects from INBOX folder
with MailBox('imap.mail.com').login('test@mail.com', 'pwd', 'INBOX') as mailbox:
    subjects = [msg.subject for msg in mailbox.fetch()]