【问题标题】:Python Imaplib: Get new gmail mails without reconnectPython Imaplib:无需重新连接即可获取新的 gmail 邮件
【发布时间】:2015-03-27 06:21:49
【问题描述】:

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

【问题讨论】:

  • 如果将这两行 mail.login(user,passwd) mail.select("inbox") 移动到 while 循环中会怎样?这不是一个完美的修复,但可以给你想要的结果,或者如果这个库支持流数据模式,你可以查找?
  • @Anmol_uppal 是的,如果我每次都登录,但由于 gmail 登录率限制,我特别想避免这种情况。我对 imap 了解不多,如果流数据模式是指 imap IDLE,那么我不这么认为。根据我的阅读,IDLE 是一种获取新电子邮件推送更新的方法,但 python imaplib 不支持。
  • 尝试在循环内仅复制mail.select("inbox") 这一行,看看是否可行?我对此不确定,但我猜它应该可以工作
  • @Anmol_uppal 这行得通,非常感谢。我本可以发誓我在 ipython 中尝试过,但显然我是个白痴。
  • 欢迎您,伙计,我已经发布了解决方案,欢迎您进行任何编辑:)

标签: python email gmail imap gmail-imap


【解决方案1】:

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

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)

【讨论】:

    【解决方案2】:

    改为删除time.sleep(60)use idle() from this version of imaplib。 29 分钟的超时就可以了。如果您的网络前面有一个损坏的 NAT 网关,您可能必须使用更短的超时时间。

    IMAP 命令 IDLE 指示服务器在发生任何变化时立即通知客户端。所以你运行 IDLE,然后当服务器说什么时,你重新运行你的搜索。您应该能够以这种方式在一两秒钟内对变化做出反应。

    【讨论】:

    • 对不起,你能用 IDLE 显示代码示例吗?如何使用它...?
    • Noop 非常不同。它不会让服务器有机会在发生更改时报告更改,只有在运行 noop 时才报告。
    【解决方案3】:

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

    【讨论】:

    • 这是实际答案,没有破解。而不是 mail.select("inbox") 做 mail.noop()
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-11
      • 2012-10-24
      • 2021-12-01
      • 1970-01-01
      • 2012-11-30
      • 2014-10-06
      • 1970-01-01
      • 2012-11-19
      相关资源
      最近更新 更多