如何判断imaplib2的idle响应是否因超时而导致
我正在使用 imaplib2 (文档) 来和一个IMAP服务器进行交互。
我使用了 idle 命令,并设置了超时和回调函数。
问题是,我不知道回调函数是因为超时触发的,还是因为服务器上发生了变化需要我去查看。
每次我得到的结果都是 ('OK', ['IDLE terminated (Success)'])
。
这是两种情况的调试输出:
超时:
15:43.94 MainThread server IDLE started, timeout in 5.00 secs
15:48.94 imap.gmail.com handler server IDLE timedout
15:48.94 imap.gmail.com handler server IDLE finished
15:48.94 imap.gmail.com writer > DONE\r\n
15:49.17 imap.gmail.com reader < DDDM6 OK IDLE terminated (Success)\r\n
15:49.17 imap.gmail.com handler _request_pop(DDDM6, ('OK', ['IDLE terminated (Success)']))
发生了某些事情:
18:41.34 MainThread server IDLE started, timeout in 50.00 secs
19:01.35 imap.gmail.com reader < * 1 EXISTS\r\n
19:01.37 imap.gmail.com handler server IDLE finished
19:01.37 imap.gmail.com writer > DONE\r\n
19:01.59 imap.gmail.com reader < BFCN6 OK IDLE terminated (Success)\r\n
19:01.59 imap.gmail.com handler _request_pop(BFCN6, ('OK', ['IDLE terminated (Success)']))
我漏掉了什么吗?
这个功能在 imaplib2 中就不存在吗?
2 个回答
0
每次收到这个回复时,你需要手动检查是否有新消息。你可以把消息的唯一标识符(UID)存储在一个列表里,然后在每次回调时把新的UID和这个列表里的进行比较。这样你就能轻松判断是否有新消息或者是否超时了。
4
Piers Lauder(imaplib2的作者)刚刚在imaplib2-devel邮件列表上回答了这个问题。他说:
我认为测试IDLE是否超时的方法是执行:
instance.response('IDLE')
这将返回:
('IDLE', ['TIMEOUT'])
如果IDLE返回超时的原因,而不是其他情况(比如
('IDLE', [None])
)。我同意这应该被记录下来,所以我会修正imaplib2.html文档。