【发布时间】:2020-09-10 18:36:52
【问题描述】:
我有一些工作代码来获取邮件正文,我想用非 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')
suggested code 工作正常,但返回的数组 (msg[0]) 包含超出范围的邮箱索引。相反,当我使用 .search 类时,只要我搜索 ASCII 字符串(此处不接受 UTF-8 和非 UTF-8 编码的字符串),就会返回有效索引。因此,我不太了解.uid 的行为和逻辑。如果有人可以帮助我,我将不胜感激。
如何使用 UTF-8 字符串过滤主题?
【问题讨论】:
-
'search' 和 'mid search' 之间的唯一区别在于它是否返回消息序列号(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].decode('utf-8').split()for uid in messages:` res, msg = imap.uid('fetch', uid, '(RFC822)') ` ` #parsing logic to follow ` 感谢您使用 UID 的努力和建议。 imaplib 页面上写着推荐.uid。 -
尝试使用高级库:github.com/ikvk/imap_tools
-
感谢@Vladimir 的建议,我将在下一个项目中尝试一下。
标签: python python-3.x imaplib