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

时间:2015-01-28 11:11:40

标签: python email gmail imap gmail-imap

我正在编写一个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)

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

如果使用Google搜索并查看了imaplib文档,但无法找到有用的内容。

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

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

4 个答案:

答案 0 :(得分:4)

这是一种热门和试用的方法,最后我们得到了一个解决方案,但不是最佳的,黑客是每次脚本从睡眠状态唤醒后重新连接,从开始取回收件箱,这可以通过刷新页面很容易完成(就像我们在普通浏览器中重新加载一样),所以看起来像这样:

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)

答案 1 :(得分:1)

取而代之的是time.sleep(60)use idle() from this version of imaplib。超时29分钟就可以了。如果您的网络前面有一个损坏的NAT网关,则可能必须使用较短的超时。

IMAP命令IDLE指示服务器在任何更改后立即通知客户端。因此,您运行IDLE,然后当服务器说出某些内容时,您将重新运行搜索。您应该能够在一两秒内对变化作出反应。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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