Imap搜索条件 - imaplib(python)

时间:2011-07-12 15:08:56

标签: python gmail imap imaplib

我正在使用imaplib进行python,我遇到了一个奇怪的行为。我真的不知道这是一个imap ou imaplib问题/功能,所以我希望有人能给我一些灯。

在我的项目中,我在我的Gmail邮箱上进行了几次搜索。想象一下,我使用以下标准进行imap搜索:

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

现在,如果我从“日期A”开始收到电子邮件,则imap(lib)执行预期操作:返回“日期A”之后和“数据B”之前的电子邮件。可爱。 但是,如果我从“日期A”开始没有电子邮件,imap(lib)就会忽略它并在“日期B”之前返回所有电子邮件,即使它们不是“数据A”!

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

我真的需要有能力搜索任何给定的时间段,而且我不必在每次搜索之前都不需要将这个盒子集中在一起才知道最后一封电子邮件的日期。

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

2 个答案:

答案 0 :(得分: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`

答案 1 :(得分: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