Python 随着服务器越来越满,IMAP的搜索速度越来越快

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

在我正在编程的一个应用程序中,我目前正在使用IMAP的搜索功能获取电子邮件ID,这很好,因为这是一项简单而容易的任务,但是我想知道,随着服务器越来越满,这是否会对搜索速度有害(目前速度很快),如果是这样,是否值得处理IMAP idle命令和twisted.internet.mail

我已经用这个实现了

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
来完成的。