Simple SMTP server
Tim Williams
listserver at tdw.net
Thu Jun 9 10:20:41 EDT 2005
----- Original Message -----
From: "Jesse Noller" <jnoller at gmail.com>
> I am looking at implementing a simple SMTP server in python - I know
> about the smtpd module, but I am looking for code examples/snippets as
> the documentation is sparse.
>
> If anyone has any good examples/recipes I'd greatly appreciate it.
This is a test server I put together (part adapted from somewhere else)
earlier in the week, it is multithreaded inbound. You could add your
required functionality quite easily. It currently starts on port 2525
(watch out for line-wraps)
##
#! /usr/bin/python
import sys
from socket import *
from SocketServer import *
class SMTPServer(ThreadingMixIn, TCPServer):
#
# other functions exist here in the live server
#
def noFunction():
pass
#end of class SMTPServer
class SMTPRequestHandler(StreamRequestHandler):
def handle(self):
self.terminated = 0
self.SendResponse('220 ** Welcome **')
commands={ 'HELO' : self.__HELO, # supported commands
'QUIT' : self.__QUIT,
#'MAIL' : self.__MAIL,
#'RCPT' : self.__RCPT,
'NOOP' : self.__NOOP,
#'RSET' : self.__RSET,
'EHLO' : self.__HELO, # handled by HELO
#'DATA' : self.__DATA,
}
while not self.terminated:
try:
self.inputline = self.rfile.readline()
self.inputline = self.inputline.rstrip().upper()
except:
self.inputline = '*?*'
request = self.inputline.split()
print "request=",request
if request and commands.has_key(request[0]): # eg: if
has_key FROM
commands[request[0]](request)
else:
self.SendResponse("?? "+ self.inputline)
def __HELO(self,request):
if request[0]== 'HELO':
self.SendResponse('250 2.1.0 Hello')
else:
self.SendResponse('250-Hello\r\n250-SIZE
9999999\r\n250-ENHANCEDSTATUSCODES\r\n250 HELP')
def __NOOP(self,request):
self.SendResponse('250 2.1.0 OK')
def __QUIT(self,request):
self.terminated = 1
self.SendResponse('Goodbye')
print "Session Closed"
def SendResponse(self,msg):
print msg
msg = msg + '\r\n'
self.wfile.write(msg)
self.wfile.flush()
# end of class SMTPRequestHandler
def StartSMTPServer():
print '*'*35
print 'Server Starting, CTRL-C to end'
print '*'*35
setdefaulttimeout( 30 ) # timeout incoming connections
server = SMTPServer(('', 2525 ), SMTPRequestHandler)
server.serve_forever()
#end of def StartSMTPServer
if __name__ == '__main__':
StartSMTPServer()
More information about the Python-list
mailing list