0

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

我已经通过这个实现了 IDLE

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 犹豫的原因首先是如果服务器不支持它我就不能使用它(尽管这不是主要原因),我也不希望是因为空闲命令是未标记的响应以及如何知道它们是针对空闲命令的。

4

1 回答 1

1

来自 RFC:

当客户端准备好接受未经请求的邮箱更新消息时,从客户端向服务器发送 IDLE 命令。

因此,如果有其他命令正在进行中 - 您可能会将其结果与对 IDLE 命令的未标记响应混淆 - 不要发送 IDLE 命令。

仅当您准备正确解释其未标记的响应时才发送 IDLE。:)

或者更简单地说,不要将 IDLE 与任何其他命令同时使用。然后,当您使用 IDLE 时,您知道所有未标记的响应都是针对 IDLE 命令的。

至少,这可能是对的。与任何 IMAP4 主题一样......谁真正知道。您可能需要检查要与之互操作的服务器,并查看它们的行为是否真正符合 RFC 中规定的愿景。

于 2013-01-31T16:14:54.883 回答