首页 > 解决方案 > 在遇到具有特定字段的特定电子邮件之前,如何搜索电子邮件?

问题描述

我的代码定期监控电子邮件收件箱。

代码示例:

mail = imaplib.IMAP4_SSL(host=server, port=port)
mail.login(account, password)
mail.select()
typ, msgnums = self.mail.search(*WHERE I WANT TO IMPLEMENT*)

一次监控结束后,我保存最后一次看到的电子邮件的“消息 ID”字段。

对于下一次监控,我想在收件箱中搜索从最新电子邮件到具有“Message-ID”字段的电子邮件。

我怎样才能做到这一点?

我检查了 imap 搜索条件,但找不到任何可用于这种情况的条件。

谢谢 :)

标签: pythonemailimap

解决方案


一次监控结束后,我保存最后一次看到的电子邮件的“消息 ID”字段。

对于下一次监控,我想在收件箱中搜索从最新电子邮件到具有“Message-ID”字段的电子邮件。

您不能在Message-ID现场这样做,因为并非所有 smtp 提供商都在消息 ID 中使用日期或增加序列号。所以Message-ID: XYZ可以在之前或之后Message-ID: ABC。参见Message-IDvs UID,关于 SO

  1. UID工作,如果小心使用:

邮箱名称、UIDVALIDITY和的组合UID必须永远引用该服务器上的单个不可变消息。

使用另一个 SO 答案中的示例:

    mail.search('UID 2000:*')
  1. 您还可以使用上次检查的电子邮件的日期字段。参考另一个 SO 答案RFC3501 的 SEARCH 部分

     typ, msgnums = mail.search('SINCE 1-Feb-1994')
    

确保日期采用该格式。您可能在同一 24 小时内返回的消息重叠,因此您UIDs还需要保存,以避免重新获取这些消息。

  1. 如果您的客户是唯一访问收件箱的人,您也可以使用UNSEEN,但我不推荐:

     mail.search('UNSEEN')
    

推荐阅读