Advertisement
MasterAler

mailer

Mar 2nd, 2016
322
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.40 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. import sys
  4. import os
  5. import smtplib
  6. import imaplib
  7. import email
  8. import base64
  9. import re
  10.  
  11. from email.mime.multipart import MIMEMultipart
  12. from email.mime.text import MIMEText
  13.  
  14. class Mailer(object):
  15.     """
  16.       Replies to emails on yandex
  17.    """
  18.    
  19.     __answer_html = ""
  20.     __answer_text = ""
  21.     __imap_server = "imap.yandex.ru"
  22.     __imap_port = 993
  23.     __smtp_server = "smtp.yandex.ru"
  24.     __smtp_port = 465
  25.     __mail_user = ""  
  26.     __mail_password = ""
  27.     __from_filter = ""
  28.     __filter_subject = ""
  29.  
  30.     __my_name = ""
  31.     __subject_text = "Reply"
  32.    
  33.     def load_answer(self, filename):
  34.         """ Loads answer template from file"""
  35.         f = open(filename, "r")
  36.         try:
  37.             self.__answer_html = '\n'.join(f.readlines())
  38.         except:
  39.             print("Answer data not found!\n")
  40.         f.close()
  41.        
  42.     def set_answer_text(self, text_answer):
  43.         """ Not really needed, in case html is not supported"""
  44.         self.__answer_text = text_answer
  45.        
  46.     def get_unread_emails(self):
  47.         """ Reads emails, fetches user data with regexps """
  48.         conn = imaplib.IMAP4_SSL(self.__imap_server, self.__imap_port)
  49.         result = []
  50.  
  51.         try:
  52.             print("Connecting to server...")
  53.             (retcode, capabilities) = conn.login(self.__mail_user, self.__mail_password)
  54.         except:
  55.             print("Connect to mail server failed")
  56.             return
  57.            
  58.         if retcode != 'OK':
  59.             print("Connect failed")
  60.             return
  61.  
  62.         conn.select() # Select inbox or default namespace
  63.         (retcode, messages) = conn.search(None, '(UNSEEN)', '(FROM "%s")' % self.__from_filter)
  64.         if retcode == 'OK':
  65.             i = 0
  66.             letters = messages[0].split()
  67.             print("%i new letters, processing" % len(letters))
  68.             print(40 * '-')
  69.             for num in letters:
  70.                 i += 1
  71.                 print('Processing : %i letter...' % i)
  72.                
  73.                 typ, data = conn.fetch(num, '(UID BODY[TEXT])') #'(RFC822)'
  74.                
  75.                 for response_part in data:
  76.                     if isinstance(response_part, tuple):
  77.                         original = email.message_from_bytes(response_part[1])
  78.  
  79.                         try:
  80.                             body = str(base64.b64decode(original.as_string()))
  81.                         except:
  82.                             body = original.as_string()
  83.                            
  84.                         #print(body)
  85.                        
  86.                         first_name = re.search('First_name: .*?<', body).group()[12:-1]
  87.                         last_name = re.search('Last_name: .*?<', body).group()[11:-1]
  88.                         user_email = re.search('email: .*?<', body).group()[7:-1]
  89.                        
  90.                         result.append({
  91.                             "first_name" : first_name,
  92.                             "last_name"  : last_name,
  93.                             "email"      : user_email
  94.                         })
  95.                        
  96.                         ret, msg = conn.store(num,'+FLAGS','\\Seen')
  97.                        
  98.                         if ret == 'OK':
  99.                             print(ret, '\t%i read successfully' % i, '\n', 30 * '-')
  100.                            
  101.         conn.close()
  102.         return result
  103.        
  104.     def send_answers(self, user_data):
  105.         """ Sends answers by template"""
  106.         mail = smtplib.SMTP_SSL(self.__smtp_server, self.__smtp_port)      
  107.  
  108.         try:
  109.             print("Connecting to server before sending...")        
  110.             mail.login(self.__mail_user, self.__mail_password)
  111.         except:
  112.             print("Connect to mail server failed")
  113.             return
  114.        
  115.         print("Started processing answers", '\n', 30 * '-')
  116.         for user in user_data:
  117.             first_name = user["first_name"]
  118.             last_name = user["last_name"]
  119.             user_email = user["email"]
  120.             print("Processing ", first_name, " ", last_name)
  121.            
  122.             msg = MIMEMultipart('alternative')
  123.             msg['Subject'] = self.__subject_text
  124.             msg['From'] = self.__mail_user
  125.             msg['To'] = user_email
  126.            
  127.             text =  self.__answer_text.replace("%first_name%", first_name).replace("%last_name%", first_name).replace("%answerer%", self.__my_name)                                    
  128.             html =  self.__answer_html.replace("%first_name%", first_name).replace("%last_name%", first_name).replace("%answerer%", self.__my_name)
  129.                                    
  130.             part1 = MIMEText(text, 'plain')
  131.             part2 = MIMEText(html, 'html')
  132.            
  133.             msg.attach(part1)
  134.             msg.attach(part2)        
  135.            
  136.             try:
  137.                 mail.sendmail(self.__mail_user, user_email, msg.as_string())
  138.             except Exception as e:
  139.                 print(e)
  140.                
  141.             print("Done\n", 20 * '-')
  142.                      
  143.         mail.quit()
  144.        
  145.     def get_answer_body(self):
  146.         return self.__answer_html
  147.        
  148.     def set_from_filter(self, from_filter):
  149.         self.__from_filter = from_filter
  150.        
  151.     def set_subject_filter(self, subject_filter):
  152.         self.__subject_filter = subject_filter        
  153.        
  154.     def set_mail_user(self, mail_user):
  155.         self.__mail_user = mail_user
  156.        
  157.     def set_password(self, password):
  158.         self.__mail_password = password
  159.        
  160.     def set_my_name(self, my_name):
  161.         self.__my_name = my_name
  162.        
  163.     def set_subject(self, subject):
  164.         self.__subject_text = subject
  165.  
  166.        
  167.        
  168. if __name__ == '__main__':
  169.     mailer = Mailer()
  170.     mailer.load_answer(os.path.join(os.getcwd(), "answer_ru.html"))
  171.     mailer.set_answer_text("Hello, %username%! \n Have fun \n\n Yours, %receiver%")
  172.     mailer.set_from_filter("site@radexpro.ru") #replace with yours
  173.     mailer.set_my_name("Polina")                #replace with yours
  174.     mailer.set_mail_user("pb@radexpro.ru")       #replace with yours
  175.     mailer.set_subject("Reply")                 #replace with yours
  176.     mailer.set_password("QweioP12468")            #replace with yours
  177.     # mailer.set_subject_filter("RadExPro")
  178.     # receiving
  179.     #print(mailer.get_unread_emails())
  180.     mailer.send_answers(mailer.get_unread_emails())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement