pythonemailsmtpsmtp-authsmtpd

How to retrieve emails from python smtp server


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()

Solution

  • 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.