在我正在编程的应用程序中,我正在使用IMAP的搜索功能来获取电子邮件ID,这很好,因为它是一个简单而容易的任务但是我想知道因为服务器变得更充分会对搜索速度产生不利影响(目前速度很快)如果值得处理IMAP idle命令和twisted.internet.mail。
我已经通过此
实现了IDLEclass Command(object):
_1_RESPONSES = ('CAPABILITY', 'FLAGS', 'LIST', 'LSUB', 'STATUS', 'SEARCH', 'NAMESPACE')
_2_RESPONSES = ('EXISTS', 'EXPUNGE', 'FETCH', 'RECENT')
_OK_RESPONSES = ('UIDVALIDITY', 'UNSEEN', 'READ-WRITE', 'READ-ONLY', 'UIDNEXT', 'PERMANENTFLAGS')
defer = None
def __init__(self, command, args=None, wantResponse=(),
continuation=None, *contArgs, **contKw):
self.command = command
self.args = args
self.wantResponse = wantResponse
self.continuation = lambda x: continuation(x, *contArgs, **contKw)
self.lines = []
def format(self, tag):
if self.args is None:
return ' '.join((tag, self.command))
return ' '.join((tag, self.command, self.args))
def finish(self, lastLine, unusedCallback):
send = []
unuse = []
for L in self.lines:
names = parseNestedParens(L)
N = len(names)
if (N >= 1 and names[0] in self._1_RESPONSES or
N >= 2 and names[1] in self._2_RESPONSES or
N >= 1 and names[0] in self.wantResponse or # allows for getting the responses you want, twisted doesn't seem to do that at least with the idle command
N >= 2 and names[1] in self.wantResponse or # same as above line just with 2_RESPONSES check
N >= 2 and names[0] == 'OK' and isinstance(names[1], types.ListType) and names[1][0] in self._OK_RESPONSES):
send.append(names)
else:
unuse.append(names)
d, self.defer = self.defer, None
d.callback((send, lastLine))
if unuse:
unusedCallback(unuse)
正在发送IDLE命令
cmd = Command("IDLE", continuation = self.a)
d = self.imap_connection.sendCommand(cmd)
return d
现在我对IDLE犹豫不决的原因是,如果服务器不支持它,首先关闭我不能使用它(虽然这不是主要原因),我也不希望是因为idle命令的响应是未标记的响应以及如何知道它们是用于IDLE命令。
答案 0 :(得分:1)
来自RFC:
当IDLE命令从客户端发送到服务器时 客户端已准备好接受未经请求的邮箱更新消息。
因此,如果还有其他命令正在进行中 - 您可能会对IDLE命令的未标记响应造成混淆 - 请不要发送IDLE命令。
当您准备正确解释其未标记的响应时,仅发送IDLE。 :)
或者更简单地说,不要将IDLE与任何其他命令同时使用。然后,当您使用IDLE时,您知道所有未标记的响应都是针对IDLE命令的。
至少,这可能是正确的。与任何IMAP4主题一样......谁真的知道。您可能需要检查要与之互操作的服务器,并查看它们的行为是否与RFC中规定的愿景相符。