Python 随着服务器越来越满,IMAP的搜索速度越来越快
在我正在编程的一个应用程序中,我目前正在使用IMAP的搜索功能获取电子邮件ID,这很好,因为这是一项简单而容易的任务,但是我想知道,随着服务器越来越满,这是否会对搜索速度有害(目前速度很快),如果是这样,是否值得处理IMAP idle命令和twisted.internet.mail 我已经用这个实现了Python 随着服务器越来越满,IMAP的搜索速度越来越快,python,email,search,imap,twisted,Python,Email,Search,Imap,Twisted,在我正在编程的一个应用程序中,我目前正在使用IMAP的搜索功能获取电子邮件ID,这很好,因为这是一项简单而容易的任务,但是我想知道,随着服务器越来越满,这是否会对搜索速度有害(目前速度很快),如果是这样,是否值得处理IMAP idle命令和twisted.internet.mail 我已经用这个实现了 class Command(object): _1_RESPONSES = ('CAPABILITY', 'FLAGS', 'LIST', 'LSUB', 'STATUS', 'SEARC
class 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)
正在发送空闲命令
cmd = Command("IDLE", continuation = self.a)
d = self.imap_connection.sendCommand(cmd)
return d
现在我对IDLE犹豫不决的原因首先是,如果服务器不支持IDLE,那么我就不能使用它(虽然这不是主要原因),我也不希望这样做,因为IDLE命令的响应是未标记的响应,如何知道它们是用于IDLE命令的。来自RFC:
当
客户端已准备好接受未经请求的邮箱更新消息
因此,如果有其他正在执行的命令(其结果可能与对空闲命令的未标记响应相混淆),请不要发送空闲命令
仅在准备正确解释其未标记响应时发送IDLE:)
或者更简单地说,不要与任何其他命令同时使用IDLE。然后,当您使用IDLE时,您知道所有未标记的响应都是针对IDLE命令的
至少,这可能是对的。与任何IMAP4主题一样。。。谁知道呢。您可能需要检查要与之互操作的服务器,看看它们的行为是否与RFC中列出的愿景相符。所有存在、删除等都是未标记的响应。这有什么不同?我不确定它是否会与另一个命令混淆OK谢谢,我假设这意味着当发送另一个命令时,停止IDLE命令,运行另一个命令,然后重新运行IDLE命令Yep。如果它有帮助,考虑如果你正在执行另一个命令,你就不是“空闲”。是的,在执行任何其他操作之前,必须显式退出IDLE。您的库可能会将其提取出来,但这是通过在空闲时间发送单词
done
来完成的。