我能够用给定主题读取消息。
首先,在我的初始化中,我使用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