[Twisted-Python] IMAP fetchUID speed?

Nick Arnett narnett at liveworld.com
Tue Oct 26 14:27:14 EDT 2004

I'm trying to figure out what's happening in an IMAP implementation. 
The server at the moment has a very big backlog -- perhaps 80K messages. 
   I was expecting that if I did this:

d.addCallback(lambda x: self.proto.fetchUID('1:10'))

things would move along quickly... but there's a huge delay somewhere. 
I think it's in that callback, since I've added breakpoints in 
handleuids() and they're not being reached (as they are when I hit a 
smaller mailbox on a different server).

Thanks for any pointers...  I'm brand-new to Twisted, but sure like what 
I'm seeing in it.



I'm using the same sort of approach that John Goerzen's "Python Network 
Programming" book shows:

> class IMAPClient(IMAP4Client):
>     def connectionMade(self):
>         IMAPLogic(self)
> class IMAPFactory(protocol.ClientFactory):
>     protocol = IMAPClient
>     def __init__(self, username, password):
>         self.username = username
>         self.password = password
>     def clientConnectionFailed(self, connector, reason):
>         LOGGER.error("Client connection failed:", reason)
>         reactor.stop()
> class IMAPLogic(mail_archive_retriever):
>     def __init__(self, proto, getting_archives = 0):
>         self.parser = email.Parser.Parser()
>         self.request_topic_id = None
>         self.message_bucket = messagedb.message_inserter()
>         self.getting_archives = getting_archives
>         # Twisted stuff
>         self.proto = proto
>         self.factory = proto.factory
>         d = self.proto.login(self.factory.username, self.factory.password) # d is a Deferred
>         d.addCallback(lambda x: self.proto.select('INBOX'))  # lambda here keeps the output of the previous callback from going into this call
>         d.addCallback(lambda x: self.proto.fetchUID('1:*'))
>         d.addCallback(self.handleuids)
>         d.addCallback(self.deletemessages)
>         d.addCallback(self.logout)
>         d.addCallback(self.stopreactor)
>         d.addErrback(self.errorhappened)

More information about the Twisted-Python mailing list