问题描述
我有一些工作代码来提取邮件正文,并且我想用非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,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
类时,只要我搜索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