1 # Copyright (c) Twisted Matrix Laboratories.
2 # See LICENSE for details.
4 # You can run this module directly with:
5 # twistd -ny emailserver.tac
11 from zope.interface import implements
13 from twisted.internet import defer
14 from twisted.mail import smtp
15 from twisted.mail.imap4 import LOGINCredentials, PLAINCredentials
17 from twisted.cred.checkers import InMemoryUsernamePasswordDatabaseDontUse
18 from twisted.cred.portal import IRealm
19 from twisted.cred.portal import Portal
23 class ConsoleMessageDelivery:
24 implements(smtp.IMessageDelivery)
26 def receivedHeader(self, helo, origin, recipients):
27 return "Received: ConsoleMessageDelivery"
30 def validateFrom(self, helo, origin):
31 # All addresses are accepted
35 def validateTo(self, user):
36 # Only messages directed to the "console" user are accepted.
37 if user.dest.local == "console":
38 return lambda: ConsoleMessage()
39 raise smtp.SMTPBadRcpt(user)
44 implements(smtp.IMessage)
50 def lineReceived(self, line):
51 self.lines.append(line)
54 def eomReceived(self):
55 print "New message received:"
56 print "\n".join(self.lines)
58 return defer.succeed(None)
61 def connectionLost(self):
62 # There was an error, throw away the stored lines
67 class ConsoleSMTPFactory(smtp.SMTPFactory):
70 def __init__(self, *a, **kw):
71 smtp.SMTPFactory.__init__(self, *a, **kw)
72 self.delivery = ConsoleMessageDelivery()
75 def buildProtocol(self, addr):
76 p = smtp.SMTPFactory.buildProtocol(self, addr)
77 p.delivery = self.delivery
78 p.challengers = {"LOGIN": LOGINCredentials, "PLAIN": PLAINCredentials}
86 def requestAvatar(self, avatarId, mind, *interfaces):
87 if smtp.IMessageDelivery in interfaces:
88 return smtp.IMessageDelivery, ConsoleMessageDelivery(), lambda: None
89 raise NotImplementedError()
94 from twisted.application import internet
95 from twisted.application import service
97 portal = Portal(SimpleRealm())
98 checker = InMemoryUsernamePasswordDatabaseDontUse()
99 checker.addUser("guest", "password")
100 portal.registerChecker(checker)
102 a = service.Application("Console SMTP Server")
103 internet.TCPServer(2500, ConsoleSMTPFactory(portal)).setServiceParent(a)