[Twisted-Python] IMAP4 Client extrange behavior
César García
celord at gmail.com
Mon Feb 22 11:25:58 EST 2010
Hello all, I have this imap4 client http://www.pastebin.com/m4e387f1a
most of the code is barrowed from a IRC friend, bob_f , it works fine
but as soon as more that 1 email arrrives to the inbox, it only prints
the first new messages but not the others, I wonder what am I doing
wrong
Thanks a lot
Here is the code:
#!/usr/bin/env python
#coding=utf-8
"""
Client de IMAP4 que descarga contenido del INBOX de una cuenta en especifico
para luego extraer el numero de telefono que debe venir en los correos enviados
"""
import StringIO
import sys
from Config import retCredentials
from twisted.internet.task import LoopingCall
from twisted.internet import protocol
from twisted.internet import defer
from twisted.mail import imap4
from twisted.python import util
from twisted.python import log
from twisted.internet import reactor
debug = 1
class IMAP4Client(imap4.IMAP4Client):
def serverGreeting(self,caps):
"""
Metodo llamado cuando el servidor contesta
"""
if debug: print "On serverGreeting"
self.serverCapabilities = caps
if self.greetDeferred is not None:
d, self.greetDeferred = self.greetDeferred, None
d.addCallback(self.cbLogin)
d.callback(self)
def cbLogin(self, proto):
"""
Callback to IMAP login
"""
if debug: print "On Login"
login = self.login(self.factory.username, self.factory.password)
login.addCallback(self.startPolling)
def startPolling(self, proto):
"""
Callback to poll every x seconds
"""
call = LoopingCall(self.selectMailbox,mailbox="INBOX")
call.start(20, now=True)
def selectMailbox(self, mailbox):
"""
Select the mailbox to examin
"""
if debug: print "On selectMailbox"
mailbox = self.factory.mailbox
return self.select(mailbox).addCallback(self.cbSelectSuccess)
def cbSelectSuccess(self, selected):
"""
Examine the INBOX mailbox for new mails
"""
if debug: print "On cbSelectSuccess"
self.messageCount = selected['EXISTS']
print "Messages: ", self.messageCount
unseen = selected['EXISTS'] - selected['RECENT']
if selected['RECENT'] == 0:
print "No new messages"
return
return self.fetchMessage("%s:*" % (unseen)
).addCallback(self.cbProcMessages)
def cbProcMessages(self,messages):
print messages
class IMAP4ClientFactory(protocol.ClientFactory):
protocol = IMAP4Client
def __init__(self, username, password, onConn):
self.username = username
self.password = password
self.mailbox = 'INBOX'
self.onConn = onConn
def buildProtocol(self,addr):
if debug: print "On buildProtocol"
p = self.protocol()
p.factory = self
p.greetDeferred = self.onConn
auth = imap4.CramMD5ClientAuthenticator(self.username)
p.registerAuthenticator(auth)
return p
def clientConectionFailed(self, connector, reason):
d, self.onConn = self.onConn, None
d.errback(reason)
def ebConnection(reason):
log.startLogging(sys.stdout)
log.err(reason)
reactor.stop()
PORT = 143
RESULT = "INBOX"
def main():
credentials = retCredentials()
hostname = credentials['server']
username = credentials['mailbox']
password = util.getPassword('IMAP4 Password: ')
onConn = defer.Deferred(
).addErrback(ebConnection
)
factory = IMAP4ClientFactory(username, password, onConn)
reactor.connectTCP(hostname, PORT, factory)
reactor.run()
if __name__ == "__main__":
main()
--
http://celord.blogspot.com/
More information about the Twisted-Python
mailing list