3

我正在为 python 使用 imaplib,我遇到了一个奇怪的行为。我真的不知道这是否是 imap 或 imaplib 问题/功能,所以我希望任何人都可以给我一些提示。

在我的项目中,我对我的 gmail 邮箱进行了多次搜索。想象一下,我使用以下条件进行 imap 搜索:

((从“日期 A”开始)(在“日期 B”之前))

现在,如果我有自“日期 A”以来的电子邮件,imap(lib) 会执行预期的操作:返回自“日期 A”以来和“数据 B”之前的电子邮件。迷人的。但是,如果自“日期 A”以来我没有任何电子邮件,imap(lib) 将简单地忽略它并返回“日期 B”之前的所有电子邮件,即使它们不是自“数据 A”以来!

这是 imap 的预期行为吗?我真的不这么认为,这根本没有意义。

我真的需要搜索任何给定时间段的能力,而且我希望不必在每次搜索之前都汇集该框以了解最后一封电子邮件的日期。

任何想法?我在这里错过了什么吗?

4

2 回答 2

6
M.search(None, '(since "12-Jul-2010" before "12-Jul-2011")')

  SINCE 
     Messages whose internal date (disregarding time and timezone)
     is within or later than the specified date.

  BEFORE 
     Messages whose internal date (disregarding time and timezone)
     is earlier than the specified date.

  make sure that `SINCE < BEFORE`
于 2011-08-21T05:56:28.460 回答
0

您可以使用 imap_tools 包: https ://pypi.org/project/imap-tools/

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

from imap_tools import Q, AND, OR, NOT
# base
mailbox.fetch('TEXT "hello"')  # str
mailbox.fetch(b'TEXT "\xd1\x8f"')  # bytes
mailbox.fetch(Q(subject='weather'))  # query, the str-like object
# AND
Q(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))')
Q(OR(from_='from@ya.ru', text='"the text"'), NOT(OR(Q(answered=False), Q(new=True))), to='to@ya.ru')
# encoding
mailbox.fetch(Q(subject='привет'), charset='utf8')  # 'привет' will be encoded by MailBox._criteria_encoder
于 2019-10-09T12:54:39.330 回答