0

更新似乎是twisted处理未标记响应的方式,我发现的唯一示例似乎遍历接收到的数据并以某种方式收集对他们命令的响应,尽管我不确定如何......


我正在尝试实现 RFC 2087 ( https://www.rfc-editor.org/rfc/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')

所以我正在获取数据但结果不包含它,我认为这是因为它们是未标记的响应?

4

1 回答 1

2

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

具体来说,看看twisted.mail.imap4.Command它的finish方法。还要看一下twisted.mail.imap4.IMAP4Client._extraInfo,这是作为unusedCallbackto传递的内容Command.finish

首先,您可以检查是否正在发送对QUOTA_extraInfo命令的未标记响应(然后丢弃(嗯,记录))。

如果是这样,我怀疑您想教Command识别对QUOTA命令的QUOTAQUOTAROOT未标记响应,以便它收集它们并将它们作为触发它的结果的一部分发送。Deferred

如果没有,您可能需要更深入地挖掘逻辑Command.finish以查看数据最终位置。

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

于 2013-01-25T02:14:53.243 回答