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)

我真正想要的是从DateTime使用UTC Zulu格式(即

2019-02-28T19:43:42.529791Z  

并在收件箱上读取电子邮件,只有从该日期/时间到现在(当前时间程序正在运行)。重要的是我要使用分钟。因此,就我而言,首先是UTC时间的所有电子邮件:2月28日,时间19th小时43分钟。电子邮件每30分钟到达每30分钟,因此我需要确保也使用分钟。

您通常不能在服务器端搜索中进行此操作。IMAP搜索语言仅支持当天的粒度(没有特定时区)。您将需要搜索,抓住元数据(例如,内部状态),然后再次进行本地过滤器。

另一种选择是使用UID提供的保证。新消息总是会增加UID(假设您的邮箱未再生),因此您可以使用它来检测新消息。

如果您跟踪到目前为止处理的最高UID,则只能搜索具有较新UID的消息。假设您的服务器实现了很好,并且您不会将消息移动到文件夹中,则可以添加搜索术语UID n:*,其中n比您处理的最高UID高。这意味着从框中的n到最高消息的范围。

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

和存储(uid 1)某个地方(数据库,在磁盘上,内存等),您处理的任何消息大于当前最大的UID。

我相信这可能会起作用。

在初始时间,我删除(存档)所有带有感兴趣主题的电子邮件。然后节省日期和时间,每次我使用给定主题的收件箱阅读收件箱,并在开始日期到datenow的开始日期以及我期望多少。然后将这些电子邮件存档

您需要过滤出一些搜索结果,但一般逻辑将是:

  • 问题IMAP搜索主题和日期约束
  • 构造一个ID集中的ID集合,搜索返回的ID集合
  • 将ID设置为服务器提供日期标头的获取
  • 迭代返回的日期,修剪"日期:"通过拆分,修剪空间
  • 将剩余的字符串转换为可用于比较的日期时间
  • 丢弃具有所需窗口以外的DateTime的所有ID

最新更新