Guest User

Untitled

a guest
Mar 2nd, 2016
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.55 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.                         first_name = re.search('First_name: .*?<', body).group()[12:-1]
  85.                         last_name = re.search('Last_name: .*?<', body).group()[11:-1]
  86.                         user_email = re.search('mailto:.*?"', body).group()[7:]
  87.                        
  88.                         result.append({
  89.                             "first_name" : first_name,
  90.                             "last_name"  : last_name,
  91.                             "email"      : user_email
  92.                         })
  93.                        
  94.                         ret, msg = conn.store(num,'+FLAGS','\\Seen')
  95.                        
  96.                         if ret == 'OK':
  97.                             print(ret, '\t%i read successfully' % i, '\n', 30 * '-')
  98.                            
  99.         conn.close()
  100.         return result
  101.        
  102.     def send_answers(self, user_data):
  103.         """ Sends answers by template"""
  104.         mail = smtplib.SMTP_SSL(self.__smtp_server, self.__smtp_port)      
  105.  
  106.         try:
  107.             print("Connecting to server before sending...")        
  108.             mail.login(self.__mail_user, self.__mail_password)
  109.         except:
  110.             print("Connect to mail server failed")
  111.             return
  112.        
  113.         print("Started processing answers", '\n', 30 * '-')
  114.         for user in user_data:
  115.             first_name = user["first_name"]
  116.             last_name = user["last_name"]
  117.             user_email = user["email"]
  118.             print("Processing ", first_name, " ", last_name)
  119.            
  120.             msg = MIMEMultipart('alternative')
  121.             msg['Subject'] = self.__subject_text
  122.             msg['From'] = self.__mail_user
  123.             msg['To'] = user_email
  124.            
  125.             text =  self.__answer_text.replace("%first_name%", first_name).replace("%last_name%", first_name).replace("%answerer%", self.__my_name)                                    
  126.             html =  self.__answer_html.replace("%first_name%", first_name).replace("%last_name%", first_name).replace("%answerer%", self.__my_name)
  127.                                    
  128.             part1 = MIMEText(text, 'plain')
  129.             part2 = MIMEText(html, 'html')
  130.            
  131.             msg.attach(part1)
  132.             msg.attach(part2)        
  133.            
  134.             try:
  135.                 mail.sendmail(self.__mail_user, user_email, msg.as_string())
  136.             except Exception as e:
  137.                 print(e)
  138.                
  139.             print("Done\n", 20 * '-')
  140.                      
  141.         mail.quit()
  142.        
  143.     def get_answer_body(self):
  144.         return self.__answer_html
  145.        
  146.     def set_from_filter(self, from_filter):
  147.         self.__from_filter = from_filter
  148.        
  149.     def set_subject_filter(self, subject_filter):
  150.         self.__subject_filter = subject_filter        
  151.        
  152.     def set_mail_user(self, mail_user):
  153.         self.__mail_user = mail_user
  154.        
  155.     def set_password(self, password):
  156.         self.__mail_password = password
  157.        
  158.     def set_my_name(self, my_name):
  159.         self.__my_name = my_name
  160.        
  161.     def set_subject(self, subject):
  162.         self.__subject_text = subject
  163.  
  164.        
  165.        
  166. if __name__ == '__main__':
  167.     mailer = Mailer()
  168.     mailer.load_answer(os.path.join(os.getcwd(), "answer_ru.html"))
  169.     mailer.set_answer_text("Hello, %username%! \n Have fun \n\n Yours, %receiver%")
  170.     mailer.set_from_filter("sales@radexpro.ru") #replace with yours
  171.     mailer.set_my_name("Polina")                #replace with yours
  172.     mailer.set_mail_user("pb@radexpro.ru")       #replace with yours
  173.     mailer.set_subject("Reply")                 #replace with yours
  174.     mailer.set_password("QweioP12468")            #replace with yours
  175.    # mailer.set_subject_filter("RadExPro")
  176.     # receiving
  177.     print(mailer.get_unread_emails())
  178.    
  179.     #sending
  180.    # mailer.send_answers([{
  181.    #     "first_name" : "Foo",
  182.    #     "last_name"  : "Bar",
  183.    #     "email"      : "pb@radexpro.ru"
  184.    # }])
  185.    
  186.     # real usage below
  187.    # mailer.send_answers(mailer.get_unread_emails())
Add Comment
Please, Sign In to add comment