I made a SMTP server using smtpd module in python. I have been able to get emails and store them in a sqlite database, but the problem is that I have no idea how to retrieve them.
I tried using the following code but I'm not sure if it's reliable.
import smtpd
import asyncore
import sqlite3
import datetime
import dol # custom module that i have created to do authentication while retrieving the email
import threading
class CustomSMTPServer(smtpd.SMTPServer):
def process_message(self, peer, mailfrom, rcpttos, data):
print 'Receiving message from:', peer
print 'Message addressed from:', mailfrom
print 'Message addressed to :', rcpttos
print 'Message length :', len(data)
print "Message :",data
print data.split("\n\n")
smtp_auth_cursor.execute("SELECT username FROM smtp_auth_table")
smtp_entry=smtp_auth_cursor.fetchall()
print smtp_entry
subject="project"
for x in smtp_entry:
x=x[0]
name=x+"@example.com"
if x in name:
print "entry"
d=datetime.date.today()
print "entry"
date=d.strftime("%A %d. %B %Y")
print date
time=datetime.datetime.now().strftime("%I:%M %p")
print time
rcpt=rcpttos[0]
try :
mail_list_cursor.execute("INSERT INTO mail_list VALUES(101,NULL,?,?,?,?,?,?)",(mailfrom,rcpt,subject,data,date,time))
except sqllite3.Error, e:
print "Error %s:" % e.args[0]
return
print "hasdf"
return
return
def __del__(self):
server.close()
def Smtp_service(ip,port):
server = CustomSMTPServer(('127.0.0.1', 2035), None)
server.set_reuse_addr=True
threading.Thread(target=dol.Mail_retrive,args=(ip,port,1)).start()
asyncore.loop()
Then I made this authenticating module that authenticates while retrieving emails. Here is where I started getting lost:
class Handler(BaseHTTPRequestHandler):
''' Main class to present webpages and authentication. '''
def do_HEAD(self):
print "send header101"
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
def do_AUTHHEAD(self):
print "send header"
self.send_response(401)
self.send_header('WWW-Authenticate', 'Basic realm=\"Test\"')
self.send_header('Content-type', 'text/html')
self.end_headers()
def authenticate(self):
conn=sqlite3.connect(smtp_auth_table,isolation_level=None)
cursor=conn.cursor()
cursor.execute("SELECT MAX(SNO)FROM smtp_auth_table")
max_no=cursor.fetchone()
cursor.execute("SELECT * FROM smtp_auth_table")
entry=cursor.fetchall()
passstring=self.headers.getheader('Authorization')
flag_no=0
for x in entry:
setstring=''
setstring=x[1]+":"+x[2]
setstring=str(setstring)
checkstring=base64.b64encode(setstring)
checkstring="Basic "+checkstring
if checkstring==passstring:
return 1
flag_no=flag_no+1
if flag_no==max_no:
return 0
def do_GET(self):
''' Present frontpage with user authentication. '''
if self.headers.getheader('Authorization') == None:
self.do_AUTHHEAD()
self.wfile.write('no auth header received')
pass
elif self.authenticate():
self.do_HEAD()
self.wfile.write(self.headers.getheader('Authorization'))
self.wfile.write('authenticated!')
pass
else:
self.do_AUTHHEAD()
self.wfile.write(self.headers.getheader('Authorization'))
self.wfile.write('not authenticated')
pass
httpd = SocketServer.TCPServer(("", 10009), Handler)
httpd.serve_forever()
if __name__ == '__main__':
main()
SMTP is a transport protocol that is only for sending messages - strictly for delivery. You cannot use it to retrieve messages. You need to implement POP or IMAP on top of your message store so that clients (email programs) can retrieve messages.
However if your end goal is to simply display messages on a web page; you can use any Python framework to read the message store and display the message body and headers.
My favorite is Flask
for such lightweight tasks.