在遇到具有特定字段的特定电子邮件之前,如何搜索电子邮件?

How can I search emails until I encounter a certain email that has a specific field?

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

代码示例:

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

一次监控结束后,我保存最后一次查看的邮件的'Message-ID'字段。

为了下次监控,我想搜索收件箱从最新的邮件到有'Message-ID'字段的邮件。

我怎样才能做到这一点?

我检查了 imap 搜索条件,但找不到任何可用于此案例的条件。

谢谢:)

After one monitoring ends, I save the last seen email's 'Message-ID' field.

For the next monitoring, I want to search the inbox from the latest email to the email that has the 'Message-ID' field.

您不能在 Message-ID 字段上执行此操作,因为并非所有 smtp 提供商都在邮件 ID 中使用日期或增加的序列号。所以 Message-ID: XYZ 可以在 Message-ID: ABC 之前或之后。参见

  1. UID 有效,如果小心使用:

The combination of mailbox name, UIDVALIDITY, and UID must refer to a single immutable message on that server forever.

使用 another SO answer 中的示例:

    mail.search('UID 2000:*')
  1. 您还可以使用上次检查电子邮件的日期字段。参考one more SO answer and the SEARCH section of RFC3501:

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

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

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

     mail.search('UNSEEN')