[Twisted-Python] Multiple clients
Szabolcs Balogh
bszabolcs at gmail.com
Fri Jun 18 10:34:08 EDT 2010
I have used the following code, which is working until I called it multiple
time:
class ImapProtocol(twisted.mail.imap4.IMAP4Client):
...
implementation
...
class ImapFactory(twisted.internet.protocol.ClientFactory):
def __init__(self, account):
self.account = account
self.deferred = twisted.internet.defer.Deferred()
self.protocol = ImapProtocol
def clientConnectionFailed(self, connection, reason):
"""
Called when the client has failed to connect
"""
self.deferred.errback(reason)
class ImapClient(gobject.GObject):
def __init__(self, account):
super(ImapClient, self).__init__()
self.account = account
self.host = self.account.get_server_address()
self.port = self.account.get_server_port()
self.ssl = self.account.get_use_ssl()
def got_mailbox_list(self, result):
twisted.internet.reactor.stop()
def handle_error(self, error):
twisted.internet.reactor.stop()
def get_mailbox_list(self):
"""
Get the list of existing mailboxes.
"""
imapfactory = ImapFactory(self.account, self.LIST_MAILBOX)
imapfactory.deferred.addCallback(self.got_mailbox_list)
imapfactory.deferred.addErrback(self.handle_error)
if self.ssl:
# Using SSL for encrypted connections
contextfactory = twisted.internet.ssl.ClientContextFactory()
twisted.internet.reactor.connectSSL(self.host, self.port,
imapfactory, contextfactory, 4)
else:
# Server doesn't require SSL
twisted.internet.reactor.connectTCP(self.host, self.port,
imapfactory, 4)
twisted.internet.reactor.run()
I call it in the following way:
imap_client = imapclient.ImapClient(account)
imap_client.get_mailbox_list()
If I call it only once, it executes successfully, but if I call it twice it
get blocks and never finishes...
So how can I start the reactor and use the connectSSL/connectTCP methods
multiple times? How to add new clients to an existing reactor?
On Friday 18 June 2010 16:01:02 exarkun at twistedmatrix.com wrote:
> On 10:36 am, bszabolcs at gmail.com wrote:
> >Hy,
> >
> >Can somebody send me a small example how to use multiple clients at
> >same
> >time? For example to connect to 3 different IMAP server. I need this
> >because
> >I'm working on an email client engine. I can connect to POP/IMAP/SMTP
> >server
> >to download and send messages, but I have created those methods
> >separated,
> >and each time when I check for new messages or send a message I use
> >reactor.run() and reactor.stop(). But calling it multiple times is a
> >problem.
>
> Why?
>
> >So I need something:
> >- when I press button1, the application checks for new messages on POP
> >server.
> >- when I press button2, the application checks for new messages on IMAP
> >server.
>
> How about:
>
> def onbutton1(self):
> checkPOP()
>
> def onbutton2(self):
> checkIMAP()
>
> >I know how to check for messages on IMAP/POP server, but I don't know
> >how to
> >do it periodically with twisted...
>
> Periodically as in "once every N seconds"? Check out reactor.callLater
> or twisted.internet.task.LoopingCall.
>
> Jean-Paul
>
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
More information about the Twisted-Python
mailing list