Python 使用imaplib搜索UTF-8编码的受试者

Python 使用imaplib搜索UTF-8编码的受试者,python,python-3.x,imaplib,Python,Python 3.x,Imaplib,我有一些提取邮件正文的工作代码,我想用非ascii字符串过滤主题。其他论坛建议使用.uid类这样做,但这种行为对我来说不符合逻辑 当前代码: import imaplib import email username = secret password = secret imap = imaplib.IMAP4_SSL("imap.gmail.com") status, messages = imap.select("INBOX",readonly=T

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

当前代码:

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')
建议代码:

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')
该方法工作正常,但返回的数组(
msg[0]
)包含超出范围的邮箱标记。相反,当我使用
.search
类时,只要我搜索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


“搜索”和“中间搜索”之间的唯一区别在于,它返回的是消息序列号(MSN,编号1-N,N是邮箱中的邮件数)还是唯一标识符(UID,编号递增,数字通常不会重复使用,即使消息已删除)。uid更稳定,建议在任何情况下都使用它们:
x.fetch(…)
->
x.uid('fetch',…)
x.search(…)
->
x.uid('search',…)
,等等。我用以下方法解决了这个问题:
res,msg=imap.uid('search',None',HEADER Subject'Subject to filter'))
messages=msg[0]。解码('utf-8').split()
对于消息中的uid:
`res,msg=imap.uid('fetch',uid'(RFC822)```解析逻辑以遵循``感谢您的努力和使用uid的建议。imaplib页面上说明建议使用
.uid
。尝试使用高级库:感谢@Vladimir的建议,我将在下一个项目中尝试一下。