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

jan*_*neh 14 python email mime imap character-encoding

我正在显示新的电子邮件IMAP,一切看起来都很好,除了一个邮件主题显示为:

=?utf-8?Q?Subject?=

我该如何解决?

ata*_*lor 28

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

import email.Header
text, encoding = email.Header.decode_header('=?utf-8?Q?Subject?=')[0]
Run Code Online (Sandbox Code Playgroud)

查看文档以email.Header获取更多详细信息.


phi*_*hag 9

这是一个MIME 编码字.你可以解析它email.header:

import email.header

def decode_mime_words(s):
    return u''.join(
        word.decode(encoding or 'utf8') if isinstance(word, bytes) else word
        for word, encoding in email.header.decode_header(s))

print(decode_mime_words(u'=?utf-8?Q?Subject=c3=a4?=X=?utf-8?Q?=c3=bc?='))
Run Code Online (Sandbox Code Playgroud)


sna*_*erb 7

在 Python 3.3+ 中,如果email.parserpolicy参数设置为policy.default

>>> 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>'
Run Code Online (Sandbox Code Playgroud)

解析类和函数是:

令人困惑的是,高达至少3.8的Python,这些解析函数的默认政策是不是policy.default,但是policy.compat32,这确实不是解码“编码字”。

>>> msg = email.message_from_file(open('message.txt'))
>>> msg['from']
'=?utf-8?q?Pep=C3=A9?= Le Pew <pepe@example.com>'
Run Code Online (Sandbox Code Playgroud)


Art*_*kyi 5

试试Imbox

因为imaplib是一个非常过多的低级库并返回难以使用的结果

安装

pip install 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
Run Code Online (Sandbox Code Playgroud)