我正在编写一个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速率限制。
答案 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会话。