【问题标题】:How can I search a mailbox with the last checked time, not a date?如何使用上次检查时间而不是日期搜索邮箱?
【发布时间】:2020-04-29 09:19:52
【问题描述】:

我的 python 代码导入 imaplib,如下所示:

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

我连接到服务器并定期检查收件箱,并保存上次看到邮件的时间数据。

对于下一次邮件检查,我想搜索从那时起收到的邮件,这样我就不必处理已经看过的邮件了。

我尝试使用 SEARCH 标准之一,但他们似乎只关心日期,而不关心时间。

如何搜索从某个时间后收到的电子邮件?

【问题讨论】:

  • 您应该使用 UID 进行搜索。在正确实现的服务器上,它们总是增加,因此您只需记住您成功获取的最后一个 UID,并获取任何大于该 UID 的 UID。就这么简单!
  • @Max 我考虑过使用 UID 获取,但是在邮箱中完成一些删除操作时,UID 不会改变吗?我做了一个实验,发现某封邮件的UID在删除之前的邮件后发生了变化,我认为使用UID并不能保证准确性。
  • UIDs 不会因其他消息被删除而改变,MSNs 会改变(例如,UID SEARCH 与 SEARCH 以及 UID FETCH 与 FETCH)。他们是不一样的!除非您的服务器严重损坏,或者您在文件夹之间移动邮件,否则 UID 是稳定的。

标签: python imap imaplib


【解决方案1】:

IMAP REF 中没有按时间搜索:https://www.rfc-editor.org/rfc/rfc3501#section-6.4.4

无论如何你都可以做到:

# get emails that have been received since a certain time
import datetime
from imap_tools import MailBox, A
with MailBox('imap.mail.com').login('test@mail.com', 'password', 'INBOX') as mailbox:
    for msg in mailbox.fetch(A(date_gte=datetime.date(2000, 1, 1))):
        print(msg.date.time(), 'ok' if msg.date.hour > 8 else '')
    

https://github.com/ikvk/imap_tools

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 2019-02-02
    • 2019-06-04
    • 1970-01-01
    相关资源
    最近更新 更多