使用 imaplib 搜索 UTF-8 编码的主题

Searching for UTF-8 encoded subjects with imaplib

我有一些用于获取邮件正文的工作代码,我想使用非 ascii 字符串过滤主题。其他论坛建议使用 .uid class 来这样做,但这种行为对我来说不符合逻辑。

当前代码:

import imaplib
import email

username = secret
password = secret

imap = imaplib.IMAP4_SSL("imap.gmail.com")

status, messages = imap.select("INBOX",readonly=True)

res, msg = imap.search(None, 'HEADER Subject "string to be encoded with UTF-8"')

建议代码:

import imaplib
import email

username = secret
password = secret

imap = imaplib.IMAP4_SSL("imap.gmail.com")

status, messages = imap.select("INBOX",readonly=True)

imap.literal = u"string to be encoded with UTF-8".encode('utf-8')
res, msg = imap.uid('SEARCH', 'CHARSET', 'UTF-8', 'SUBJECT')

suggested code 工作正常,但返回的数组 (msg[0]) 包含超出范围的邮箱索引。相反,当我使用 .search class 时,只要我搜索 ASCII 字符串,就会返回有效索引(这里不接受 UTF-8 和非 UTF-8 编码的字符串) .因此,我不太了解 .uid 的行为和逻辑。如果有人能在路上帮助我,我将不胜感激。

如何使用 UTF-8 字符串过滤主题?

我设法通过以下方式解决了这个问题,使用推荐的方式 .uid 而不是 .search:

imap = imaplib.IMAP4_SSL("server_to_connect_to")
imap.login(username, password)

status, messages = imap.select("INBOX",readonly=True)
imap.literal  = u'"Subject to be searched"'.encode('utf-8')
res, uid = imap.uid('SEARCH', 'CHARSET', 'UTF-8', 'SUBJECT')
messages = msg[0].decode('utf-8').split()

for uid in messages:
    res, msg = imap.uid('fetch', uid, '(RFC822)')
    #parsing logic