我能够阅读具有给定主题的消息。
首先在初始化过程中,我使用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分钟发送一次,因此我需要确保同时使用几分钟。
答案 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)
您需要过滤掉一些返回的搜索结果,但是一般的逻辑是: