微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

IMAP 电子邮件空闲停止等待超时持续时间,而是在 Python 中立即循环

如何解决IMAP 电子邮件空闲停止等待超时持续时间,而是在 Python 中立即循环

我有一个程序可以使用 IMAP IDLE 检查收件箱中的新电子邮件。每当我运行它时,它一开始都能完美运行。但一段时间后,它停止暂停空闲超时时间,而是快速循环第一部分。

from imapclient import IMAPClient
from imap_tools import MailBox,AND

while True:
    try:
        #this is the part that's getting looped every half second when it breaks
        telegram('try portion starting again')

        # Wait for up to 540 seconds for an IDLE response
        responses = server.idle_check(timeout=540)
        if responses:
            telegram('Email Recieved')

            for response in responses:

                if response[0] not in checked_uids:

                    checked_uids.append(response[0])

                    uid = str(response[0])

                    with MailBox(HOST).login(USERNAME,PASSWORD) as mailBox:
                        for msg in mailBox.fetch(AND(uid=uid)):

                            body_text=msg.text

                            telegram(body_text)

telegram() 向我发送电报消息的地方。

因此,当它正常工作时,我会收到一条包含新电子邮件正文的消息,并且每 540 秒我就会收到一条消息,提示 try: 部分已重新开始。

在我的测试中,它像这样工作了一段时间,然后突然之间,不知为何我无法辨别,我每秒收到两次重复到无穷大的“尝试部分重新开始”消息。意思是,似乎 responses = server.idle_check(timeout=540) 部分停止按预期工作

编辑:这是我正在使用的代码的 catch 部分。超级简单。我也没有收到任何错误消息,而程序正在变得疯狂并且如此快速地循环

except KeyboardInterrupt:
    break
except Exception as e:
    print(e)
    telegram(e)

解决方法

我想出了一个解决方案。我仍然不知道为什么会发生这种情况,但这为我解决了。

我将 server.idle() 放在 try: 代码中。然后我将 server.idle_done() 放在 finally 代码段中。这样,每次程序循环时它开始空闲,每次结束时它停止空闲。似乎每次都这样做会使程序更加稳定。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。