IMAP搜索条件 - imaplib(Python)

4 投票
2 回答
8211 浏览
提问于 2025-04-16 21:21

我在用Python的imaplib库时遇到了一些奇怪的情况。我不太确定这是imap的问题还是imaplib的特性,所以希望有人能给我一些指点。

在我的项目中,我会在我的Gmail邮箱里进行几次搜索。假设我用以下条件进行imap搜索:

((自“日期A”以来) (在“日期B”之前))

如果我有从“日期A”开始的邮件,imap(lib)会按预期工作:返回从“日期A”开始到“日期B”之前的邮件。这很好。

但是,如果我没有从“日期A”开始的邮件,imap(lib)就会忽略这个条件,直接返回所有在“日期B”之前的邮件,即使这些邮件并不是从“日期A”开始的!

这是imap的预期行为吗?我觉得这完全没有道理。

我真的需要能够在任何给定的时间段内进行搜索,我希望在每次搜索之前不必先检查邮箱,以了解最后一封邮件的日期。

有没有什么想法?我是不是漏掉了什么?

2 个回答

1

你可以使用 imap_tools 这个包:

https://pypi.org/project/imap-tools/

这个包实现了 rfc3501 中描述的搜索逻辑。

from imap_tools import A, AND, OR, NOT
# base
mailbox.fetch('TEXT "hello"')  # str
mailbox.fetch(b'TEXT "\xd1\x8f"')  # bytes
mailbox.fetch(A(subject='weather'))  # query, the str-like object
# AND
A(text='hello', new=True)  # 'TEXT "hello" NEW'
# OR
OR(text='hello', date=datetime.date(2000, 3, 15))  # '(OR TEXT "hello" ON 15-Mar-2000)'
# NOT
NOT(text='hello', new=True)  # '(NOT TEXT "hello" NEW)'
# complex:
# 'TO "to@ya.ru" (OR FROM "from@ya.ru" TEXT "\\"the text\\"") (NOT (OR UNANSWERED NEW))')
A(OR(from_='from@ya.ru', text='"the text"'), NOT(OR(A(answered=False), A(new=True))), to='to@ya.ru')
# encoding
mailbox.fetch(A(subject='привет'), charset='utf8')  # 'привет' will be encoded by MailBox._criteria_encoder
7
当然可以!不过你没有提供具体的StackOverflow内容。如果你能把需要翻译的内容发给我,我会很乐意帮你把它变得更容易理解。请把内容贴上来吧!

撰写回答