[Twisted-Python] twisted.mail newbie question

xing at mac.com xing at mac.com
Fri Aug 19 17:55:11 EDT 2005


Hi all,

I have read the twisted.mail.smtp source and ran the sample code 
(included below) in the debugger with break points and yet I still do 
not know where I can inject my code to handle actual message delivery 
where both the email message and all the recipients are available at one 
point in time.

The IMessageDelivery handler doesn't appear to see the message, and the 
IMessage only sees the message and not the recipients. As such, I'm 
thorughly confused. Very new to twisted and async programming model.

Thanks for any pointers.

I have written a basic smtp relayer wrapped around twisted smtp.sendmail 
using my own delivery queue and mx selection management and trying to 
put the last piece in: the smtp server which will hand off all incoming 
messages into my queues.


Xing Li


code
----------------------------------

from twisted.internet import defer
from twisted.protocols import smtp
from twisted.internet import reactor

class ConsoleMessageDelivery:
     __implements__ = (smtp.IMessageDelivery)

     def receivedHeader(self, helo, origin, recipients):
         for i in recipients:
             print i
         return "Received: ConsoleMessageDelivery"

     def validateFrom(self, helo, origin):
         # All addresses are accepted
         return origin

     def validateTo(self, user):
         # Only messages directed to the "console" user are accepted.
         #if user.dest.local == "console":
         return lambda: ConsoleMessage()

         #raise smtp.SMTPBadRcpt(user)

class ConsoleMessage:
     __implements__ = (smtp.IMessage,)

     def __init__(self):
         self.lines = []

     def lineReceived(self, line):
         self.lines.append(line)

     def eomReceived(self):
         print "New message received:"
         print "\n".join(self.lines)
         self.lines = None
         return defer.succeed(None)

     def connectionLost(self):
         # There was an error, throw away the stored lines
         self.lines = None

class ConsoleSMTPFactory(smtp.SMTPFactory):
     def __init__(self, *a, **kw):
         smtp.SMTPFactory.__init__(self, *a, **kw)
         self.delivery = ConsoleMessageDelivery()

     def buildProtocol(self, addr):
         p = smtp.SMTPFactory.buildProtocol(self, addr)
         p.delivery = self.delivery
         return p




if __name__ == '__main__':
     f = ConsoleSMTPFactory()

     reactor.listenTCP(25, f)
     reactor.run()





More information about the Twisted-Python mailing list