使用 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
我有一些用于获取邮件正文的工作代码,我想使用非 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