Guest User

POP3 sender python

a guest
Oct 24th, 2016
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.68 KB | None | 0 0
  1. import base64
  2. import getpass
  3. import re
  4. import socket
  5. import sys
  6. import quopri
  7. from conf import *
  8. import logging
  9. import email
  10. # from email.parser import Parser
  11.  
  12. # in conf.py put
  13. # username = ---
  14. # password = ---
  15.  
  16. port = 110
  17. login = username    
  18. password = passw
  19. host = host_addr
  20. CRLF = '\r\n'
  21. TERMINATOR = CRLF + '.' + CRLF
  22.  
  23. def decode(input_str):
  24.     result = ''
  25.     search_result = re.search('=\?([^\?]*)\?([^\?]*)\?([^\?]*)\?=', input_str)
  26.     while search_result is not None:
  27.         charset, tp, text = search_result.groups()
  28.         s = search_result.start(0)
  29.         e = search_result.end(0)
  30.         text = text.encode('cp866', 'ignore').decode('cp866', 'ignore')
  31.         result += input_str[:s]
  32.         input_str = input_str[e:].lstrip()
  33.         if tp.lower() != 'q':
  34.             result += base64.b64decode(text.encode('cp866')).decode(charset, 'ignore')
  35.         else:
  36.             result += quopri.decodestring(text).decode(charset, 'ignore')
  37.         search_result = re.search('=\?([^\?]*)\?([^\?]*)\?([^\?]*)\?=', input_str)
  38.     else:
  39.         result += input_str
  40.     return result
  41.  
  42. class pop3lib:
  43.  
  44.     message_list = []
  45.  
  46.     def send_message(self,m):
  47.         logging.debug("\nC: "+m)
  48.         self.sock.send((m + '\r\n').encode('utf-8'))
  49.  
  50.     def send_password(self,m):
  51.         logging.debug("\nC: *********")
  52.         self.sock.send((m + '\r\n').encode('utf-8'))
  53.  
  54.     def send_and_receiveline(self,mes):
  55.         logging.debug("\nC: "+mes)
  56.         self.sock.send((mes + '\r\n').encode('utf-8'))
  57.         line = self.sock.recv(2048)
  58.         logging.debug("\nS: " + line)
  59.         return line
  60.    
  61.     def receiveline(self):
  62.         line = self.sock.recv(2048)
  63.         logging.debug("\nS: " + line)
  64.         return line
  65.  
  66.     def receive_till_term(self, terminator):
  67.         response = self.sock.recv(2048)
  68.         while not response.endswith(TERMINATOR) and not response.endswith('.\r\n') and not response.endswith('.\r\n\r\n'):
  69.             new_response = self.sock.recv(2048)
  70.             response += new_response
  71.             print new_response
  72.         return response
  73.  
  74.     def get_message_count(self):
  75.         self.send_message("list")
  76.         mes = self.receive_till_term(TERMINATOR)
  77.         cnt = len(mes.split('\r\n')) - 3
  78.         return cnt
  79.  
  80.     def get_result(self,data):
  81.         addr = 'No \'From: ...\''
  82.         subj = 'No \'Subject: ...\''
  83.         data = data.decode('cp866', 'ignore')
  84.         from_data = re.search('^From:.*(.*\r?\n\s.*)*$', data, re.M | re.I)
  85.         if from_data is not None:
  86.             addr = decode(from_data.group(0))
  87.         subj_data = re.search('^Subject:.*(.*\r?\n\s.*)*', data, re.M | re.I)
  88.         if subj_data is not None:
  89.             subj = decode(subj_data.group(0))
  90.         return [subj, addr]
  91.  
  92.     def __init__(self, host_name, host_port, user_id, passw, log_level=logging.DEBUG):
  93.         logging.basicConfig(format='%(levelname)s:%(message)s', level=log_level)
  94.         try:
  95.             sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  96.             self.sock = sock
  97.             sock.connect((host_name, host_port))
  98.             self.connection = True
  99.         except Exception as e:
  100.             print('can\'t connect to {0} on {1} port \r\n{3}'.format(host, port, e.__repr__()))
  101.             self.connection = False
  102.             return
  103.  
  104.         self.server_info = self.receiveline()
  105.         auto = [
  106.             'user {0}'.format(user_id),
  107.             'pass {0}'.format(passw),
  108.         ]
  109.  
  110.         response = []
  111.         for m in auto:
  112.             self.send_password(m)
  113.             response.append(self.receiveline())
  114.  
  115.         print response
  116.  
  117.         if response[0].find("+OK Name is a valid mailbox") != -1:
  118.             self.username_valid = True
  119.         else:
  120.             self.username_valid = False
  121.  
  122.         if response[1].find("+OK Maildrop ready") != -1:
  123.             self.password_valid = True
  124.         else:
  125.             self.password_valid = False
  126.  
  127.     def get_message_list(self):
  128.         self.message_count = self.get_message_count()
  129.         addr_list = []
  130.         subj_list = []
  131.  
  132.         for message_number in range(1,self.message_count+1):
  133.             self.send_message('top {0} 0'.format(message_number))
  134.             # response = self.receive_till_term(TERMINATOR)
  135.  
  136.             response = self.sock.recv(2048)
  137.             while not response.endswith(b'\r\n.\r\n'):
  138.                 response += self.sock.recv(2048)
  139.  
  140.             subj, addr = self.get_result(response)
  141.             subj_list.append(subj)
  142.             addr_list.append(addr)
  143.             logging.info(('\nS: {0}\n{1}\n'.format(addr, subj)))
  144.         return addr_list, subj_list
  145.  
  146.  
  147.     def get_email_body(self, index):
  148.         self.send_message("RETR "+str(index))
  149.         response = self.receive_till_term(TERMINATOR)
  150.         response = '\n'.join(response.split('\n')[1:])
  151.         b = email.message_from_string(response)
  152.         body = ""
  153.         if b.is_multipart():
  154.             for payload in b.get_payload():
  155.                 body = body + payload.get_payload()
  156.         else:
  157.             body = b.get_payload()
  158.         body = body.replace("\r","")
  159.         body = body[:-2]
  160.         f =  open("message_retrieved.html","w")
  161.         f.write(body)
  162.         return body
  163.  
  164. if __name__ == "__main__":
  165.     reload(sys)  
  166.     sys.setdefaultencoding('utf8')
  167.     pop_obj = pop3lib(host,port,username,password)
  168.     # print pop_obj.get_message_list()
  169.     # print pop_obj.get_email_body(14)
  170.     print "DONE"
Add Comment
Please, Sign In to add comment