【问题标题】:How can I search emails until I encounter a certain email that has a specific field? [closed]在遇到具有特定字段的特定电子邮件之前,如何搜索电子邮件? [关闭]
【发布时间】:2020-08-10 19:12:54
【问题描述】:

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

代码示例:

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 搜索条件,但找不到任何可用于这种情况的条件。

谢谢:)

【问题讨论】:

标签: python email imap


【解决方案1】:

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

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

您不能在 Message-ID 字段上执行此操作,因为并非所有 smtp 提供商都在消息 ID 中使用日期或递增序列号。所以Message-ID: XYZ 可以在Message-ID: ABC 之前或之后。见Message-ID vs UID, on SO

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

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

使用来自another SO answer的示例:

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

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

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

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

     mail.search('UNSEEN')
    

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 2015-01-16
    • 2015-06-09
    • 2014-04-17
    • 2016-05-01
    相关资源
    最近更新 更多