title: How to retrieve emails from python smtp server
body: <p>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. </p>
  
  <p>I tried using the following code but I'm not sure if it's reliable.</p>
  
  <pre><code>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()
  </code></pre>
  
  <p>Then I made this authenticating module that authenticates while retrieving emails. Here is where I started getting lost:</p>
  
  <pre><code>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()
  </code></pre>