更新这似乎是未标记的响应由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')
所以我得到了数据,但结果不包含它,我认为这是因为它们是未标记的响应?
答案 0 :(得分:2)
由于IMAP4协议将许多不同类型的信息混合在一起作为“未标记的响应”,因此您可能还需要更新IMAP4客户端实现中解析代码的其他部分。
具体来说,请查看twisted.mail.imap4.Command
及其finish
方法。另请查看twisted.mail.imap4.IMAP4Client._extraInfo
,即unusedCallback
到Command.finish
的内容。
首先,您可以检查 QUOTA 命令的未标记响应是否正在发送到_extraInfo
(然后丢弃(好了,记录))。
如果是这样,我怀疑你想教Command
识别 QUOTA 和 QUOTAROOT 对 QUOTA 命令的无标记回复,这样它就可以收集它们并将它们作为结果的一部分发送,然后用它Deferred
激活它。
如果没有,您可能需要深入了解Command.finish
的逻辑,以查看数据 的最终位置。
您可能还想实际实现Command.wantResponse
功能,该功能似乎目前仅部分形成(即,许多客户端代码尝试将有趣的值发送到Command
以初始化该属性,但是据我所知,实际上并没有使用该属性的值。)