Twisted IMAP4客户端QUOTA系列命令

时间:2013-01-24 20:15:28

标签: python imap twisted

更新这似乎是未标记的响应由twisted处理的方式,我发现的唯一示例似乎迭代通过收到的数据并以某种方式收集对其命令的响应虽然我不确定如何...


我正在尝试实现RFC 2087(http://tools.ietf.org/html/rfc2087)中定义的IMAP4配额命令。

代码 - ImapClient

class SimpleIMAP4Client(imap4.IMAP4Client):
    """
        A client with callbacks for greeting messages from an IMAP server.
        """
    greetDeferred = None

    def serverGreeting(self, caps):
        self.serverCapabilities = caps
        if self.greetDeferred is not None:
            d, self.greetDeferred = self.greetDeferred, None
            d.callback(self)

    def lineReceived(self, line):
        print "<" + str(line)
        return imap4.IMAP4Client.lineReceived(self, line)

    def sendLine(self, line):
        print ">" + str(line)
        return imap4.IMAP4Client.sendLine(self, line)

代码 - QUOTAROOT实施

def cbExamineMbox(result, proto):
    """
        Callback invoked when examine command completes.

        Retrieve the subject header of every message in the mailbox.
        """
    print "Fetching storage space"
    cmd = "GETQUOTAROOT"
    args =  _prepareMailboxName("INBOX")
    resp = ("QUOTAROOT", "QUOTA")
    d = proto.sendCommand(Command(cmd, args, wantResponse=resp))
    d.addCallback(cbFetch, proto)
    return d

def cbFetch(result, proto):
    """
        Finally, display headers.
        """
    print "Got Quota"
    print result

输出

Fetching storage space
>0005 GETQUOTAROOT INBOX
<* QUOTAROOT "INBOX" ""
<* QUOTA "" (STORAGE 171609 10584342)
<0005 OK Success
Got Quota
([], 'OK Success')

所以我得到了数据,但结果不包含它,我认为这是因为它们是未标记的响应?

1 个答案:

答案 0 :(得分:2)

由于IMAP4协议将许多不同类型的信息混合在一起作为“未标记的响应”,因此您可能还需要更新IMAP4客户端实现中解析代码的其他部分。

具体来说,请查看twisted.mail.imap4.Command及其finish方法。另请查看twisted.mail.imap4.IMAP4Client._extraInfo,即unusedCallbackCommand.finish的内容。

首先,您可以检查 QUOTA 命令的未标记响应是否正在发送到_extraInfo(然后丢弃(好了,记录))。

如果是这样,我怀疑你想教Command识别 QUOTA QUOTAROOT QUOTA 命令的无标记回复,这样它就可以收集它们并将它们作为结果的一部分发送,然后用它Deferred激活它。

如果没有,您可能需要深入了解Command.finish的逻辑,以查看数据 的最终位置。

您可能还想实际实现Command.wantResponse功能,该功能似乎目前仅部分形成(即,许多客户端代码尝试将有趣的值发送到Command以初始化该属性,但是据我所知,实际上并没有使用该属性的值。)