Python Imaplib:无需重新连接即可获取新的 Gmail 邮件

Python Imaplib: Get new gmail mails without reconnect

我正在编写一个 python 脚本,定期检查与特定搜索匹配的新电子邮件。但是,如果不重新连接,它永远不会显示新电子邮件。

mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login(user,passwd)
mail.select("inbox")
while True:
    result, idData = mail.uid('search', query, "ALL")
    processIDs(idData)
    time.sleep(60)

搜索会找到所有在登录时与我的查询匹配的电子邮件,但它永远不会找到在 运行 时到达的电子邮件。一旦我停止脚本并重新启动它,所有电子邮件都会立即显示。

如果用谷歌搜索并查看 imaplib 文档,但找不到任何有用的东西。

如何在不重新连接到 imap 服务器的情况下显示新电子邮件?

编辑:我想避免重新连接的原因是因为 gmail 速率限制。

好吧,这是一种尝试和尝试的方法,最后我们得到了一个解决方案,虽然不是最优的,hack 是每次脚本从睡眠中醒来后重新连接,从开始获取收件箱,这可以通过刷新页面轻松完成(就像我们在普通浏览器中重新加载一样),所以它可能看起来像这样:

mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login(user,passwd)
while True:
    mail.select("inbox")
    result, idData = mail.uid('search', query, "ALL")
    processIDs(idData)
    time.sleep(60)

删除 time.sleep(60)use idle() from this version of imaplib。 29 分钟的暂停是可以的。如果您的网络前面有损坏的 NAT 网关,您可能需要使用更短的超时时间。

IMAP 命令 IDLE 指示服务器在任何更改后立即通知客户端。因此,您 运行 处于空闲状态,然后当服务器发出指令时,您会重新运行 进行搜索。这样一来,您应该能够在一两秒内对变化做出反应。

我知道您已经接受了答案,但我认为比重新连接更好的方法是发出 NOOP command.

您可以在 while 循环或 IDLE 中发出 NOOP 命令来更新 IMAP 会话。