我有一个程序可以使用 IMAP IDLE 检查收件箱中的新电子邮件。每当我运行它时,它一开始就工作得很好。但一段时间后,它停止暂停 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 部分。 super 简单。当程序变得疯狂并且循环如此之快时,我也没有收到任何错误消息
except KeyboardInterrupt:
break
except Exception as e:
print(e)
telegram(e)
最佳答案
我想出了一个解决方案。我仍然不知道为什么会发生这种情况,但这为我解决了问题。
我将 server.idle()
放在 try:
代码中。然后我将 server.idle_done()
放入 finally
代码段中。这样,每次程序循环时都会启动空闲,每次结束时都会停止空闲。看来每次这样做都会让程序更加稳定。
关于python - IMAP电子邮件IDLE停止等待超时持续时间,而是在Python中立即循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67930085/