0

更新タグなしの応答がツイストによって処理される方法のようです。私が見つけた唯一の例は、受信したデータを反復処理し、方法はわかりませんが、何らかの方法でコマンドへの応答を収集するようです...


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方法を見てください。totwisted.mail.imap4.IMAP4Client._extraInfoとして渡されるも見てください。unusedCallbackCommand.finish

まず、 QUOTAコマンドに対するタグなしの応答が に送信されている_extraInfo(そしてドロップされている (ログに記録されている))かどうかを確認できます。

もしそうなら、あなたはQUOTAコマンドに対するQUOTAQUOTAROOTのタグなしの応答をCommand認識するように教えたいのではないかと思います。Deferred

Command.finishそうでない場合は、データ最終的にどこに到達するかを確認するために、 のロジックをもう少し深く掘り下げる必要があるかもしれません。

Command.wantResponse現在部分的にしか形成されていないように見える機能を実際に実装することもできます (つまり、多くのクライアント コードはCommand、その属性を初期化するために興味深い値を に送信しようとしますが、私が知る限り、実際にその値を使用するものは何もありません属性)。

于 2013-01-25T02:14:53.243 に答える