【问题标题】:Imap search criteria - imaplib (python)Imap 搜索条件 - imaplib (python)
【发布时间】:2011-10-03 17:36:09
【问题描述】:

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

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

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

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

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

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

有什么想法吗?我在这里遗漏了什么吗?

【问题讨论】:

  • 好的,我现在明白真正的问题了。问题是,事实上,我在“日期 A”和“日期 B”使用同一天(例如,“12-Jul-2011 09:46:00”和“12-Jul-2011 15:46 :00") 并且看起来 IMAP 只搜索日期的日期、月份和年份。有点蹩脚,有什么建议可以使用所有日期进行 imap 搜索?

标签: python gmail imap imaplib


【解决方案1】:

你可以使用 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

【讨论】:

    【解决方案2】:
    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`
    

    【讨论】:

    • 当然可以,但主要问题是时间(小时:分钟:秒)没有被使用,只有一天。
    猜你喜欢
    • 2016-08-15
    • 2016-03-07
    • 2023-03-31
    • 1970-01-01
    • 2014-02-17
    • 2015-08-04
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    相关资源
    最近更新 更多