使用IMAP的Python我如何从给定日期和时间到给定主题直到现在从收件箱中读取电子邮件

时间:2019-02-28 20:09:47

标签: python imap

我能够阅读具有给定主题的消息。

首先在初始化过程中,我使用IMAP登录邮件

self.mail = imaplib.IMAP4_SSL(imapName, imapPort)

然后我可以使用此方法阅读具有给定主题的电子邮件:

def readEmailWithSubject(self, mySubject, fromDateTime):
    self.mail.list()
    self.mail.select("inbox")
    subjectStr = '(HEADER Subject ' + "\"" + mySubject + "\"" + ')'
    result, UIDemailsWithGivenSubject = self.mail.uid('search', None, subjectStr)

我真正想要的是使用UTC Zulu格式的fromDateTime,即

2019-02-28T19:43:42.529791Z  

,仅从该日期/时间直到现在(当前时间程序正在运行),在收件箱中阅读具有给定主题的电子邮件。利用分钟是很重要的。因此,以我为例,首先是来自UTC时间的所有电子邮件:2月28日,时间19小时和43分钟。电子邮件每30分钟发送一次,因此我需要确保同时使用几分钟。

3 个答案:

答案 0 :(得分:0)

通常仅通过服务器端搜索无法执行此操作。 IMAP搜索语言仅支持一天的粒度(无特定时区)。您将需要搜索,获取元数据(例如INTERNALDATE字段),然后再次进行本地过滤。

另一种替代方法是使用UID提供的保证。新邮件的UID总是会增加(假设您的邮箱没有重新生成),因此您可以使用它来检测新邮件。

如果跟踪到目前为止已处理的最高UID,则只能搜索具有较新UID的邮件。假设您的服务器执行良好,并且没有将邮件移入文件夹,则可以添加搜索词UID n:*,其中n比您处理过的最高UID高一个。这意味着范围从n到框中的最高消息。

searchStr = '(UID %d:* HEADER Subject ' + "\"" + mySubject + "\"" + ')' % uidStart

并将(uid + 1)存储在某个位置(数据库,磁盘,内存等)中,以存储您处理的任何大于当前最大UID的消息。

答案 1 :(得分:0)

我相信这可能有效。

在初始化时,我删除(存档)所有具有给定主题的电子邮件。然后保存日期和时间,每次我阅读具有给定主题的收件箱,并从开始日期到dateNow解密以及我期望的数量。然后将这些电子邮件存档,以备下次使用

答案 2 :(得分:0)

您需要过滤掉一些返回的搜索结果,但是一般的逻辑是:

  • 问题IMAP一起搜索主题和日期约束
  • 从Search返回的ID的结果集中构造一个ID集
  • 通过获取Date标头提供给服务器的ID设置
  • 迭代返回的日期,并通过分割,修剪空白来修剪“日期:”
  • 将剩余的字符串转换为可用于比较的日期时间
  • 丢弃日期时间超出所需窗口的所有ID