Subversion Repositories SmartDukaan

Rev

Rev 7550 | Rev 8056 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

from email.mime.text import MIMEText
from shop2020.clients.HelperClient import HelperClient
from shop2020.clients.TransactionClient import TransactionClient
from shop2020.thriftpy.utils.ttypes import Mail
from shop2020.utils.daemon import Daemon
import optparse
import sched
import smtplib
import sys
import time
import os
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email import Encoders



class EmailSender(Daemon):
    def __init__(self, logfile='/var/log/utils/emailsender/emailsender.log', pidfile='/var/run/email-sender.pid'):
        Daemon.__init__(self, pidfile, stdout=logfile, stderr=logfile)
        print 'EmailSender initiated at', time.time()
        self.email_schedular = sched.scheduler(time.time, time.sleep)
        self.time_to_sleep = 2
        self.authenticate()

    def authenticate(self):
        try:
            print "Attempting authentication at ", time.time()
            self.sendGridMailServer = smtplib.SMTP("smtp.sendgrid.net", 587)
            self.sendGridSender = "euser"
            self.sendGridPassword = "shop2020"
            self.sendGridMailServer.ehlo()
            self.sendGridMailServer.starttls()
            self.sendGridMailServer.ehlo()
            self.sendGridMailServer.login(self.sendGridSender, self.sendGridPassword)

            self.gmailServer = smtplib.SMTP("smtp.gmail.com", 587)
            self.gmailSender = "help@shop2020.in"
            self.gmailPassword = "5h0p2o2o"
            self.gmailServer.ehlo()
            self.gmailServer.starttls()
            self.gmailServer.ehlo()
            self.gmailServer.login(self.gmailSender, self.gmailPassword)            
            print "Authentication successful", time.time()
            
        except smtplib.SMTPConnectError as e:
            print 'Specified host did not respond correctly', e        
        except smtplib.SMTPHeloError as e:
            print 'The server did not reply properly to the HELO greeting.', e
        except smtplib.SMTPAuthenticationError as e:
            print 'The server did not accept the username/password combination.', e
        except smtplib.SMTPException as e:
            print e
        except Exception as e:
            print sys.exc_info()[0]
            print e
            
    def get_attachment_part(self, document, filename):
        part = MIMEBase('application', 'octet-stream')
        part.set_payload(document)
        Encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'attachment; filename=%s' % filename + "-insurance-policy.pdf")
        return part

    def sendMail(self, mail):
        msg = MIMEMultipart()
    
        msg['From'] = "help@saholic.com"
        msg['To'] = ', '.join(mail.emailTo)
        msg['Cc'] = ', '.join(mail.cc)
        #msg['Bcc'] = ', '.join(mail.bcc)
        msg['Subject'] = mail.subject
        
        html_msg = MIMEText(mail.body, 'html')
        msg.attach(html_msg)

        if mail.emailType == "DeliverySuccess":
            tclient = TransactionClient().get_client()
            document = tclient.getDocument(1, int(mail.source))
            if document != bin(0):
                msg.attach(self.get_attachment_part(document, mail.source))
            
        try:
            self.setMailServerAndPassword(mail)
            rs = self.mailServer.sendmail(self.password, mail.emailTo + mail.cc + mail.bcc + ['backup@saholic.com'], msg.as_string())
        except smtplib.SMTPServerDisconnected as e:
            print 'Server Disconnected at', time.time()
            self.authenticate()
            rs = self.mailServer.sendmail(self.password, mail.to, msg.as_string())
        
        print msg['To']
        # Should be mailServer.quit(), but that crashes...
        return rs

    def setMailServerAndPassword(self, mail):
        self.mailServer = self.sendGridMailServer
        self.password = self.sendGridPassword
        
#        self.mailServer = self.gmailServer
#        self.password = self.gmailPassword
#
#        for receiver in mail.to:
#            if not receiver.endswith('@saholic.com') and not receiver.endswith('@shop2020.in'):
#                self.mailServer = self.sendGridMailServer
#                self.password = self.sendGridPassword
#                break

    def send(self):
        print "Despatch stared at ", time.time()
        helper_client = HelperClient().get_client()
        
        emails_to_be_dispatched = helper_client.getEmailsToBeSent()
        print len(emails_to_be_dispatched)
        
        for email in emails_to_be_dispatched:
            try:
                send_result = self.sendMail(email)
            except Exception as e:
                print sys.exc_info()[0]
                print e
                print 'Error occurred sending emails.'
                sys.exit()

            if len(send_result) == 0:
                print "Sent at", time.time()
                helper_client.markEmailAsSent(email.id)
            else:
                print "Failed sending email. Id:", " Time:", time.time()
            
        self.email_schedular.enter(self.time_to_sleep, 1, self.send, ())

    def run(self):
        self.email_schedular.enter(self.time_to_sleep, 1, self.send, ())
        self.email_schedular.run()

if __name__ == "__main__":
    parser = optparse.OptionParser()
    parser.add_option("-l", "--logfile", dest="logfile",
                      type="string",
                      help="Log all output to LOG_FILE",
                      )
    parser.add_option("-i", "--pidfile", dest="pidfile",
                      type="string",
                      help="Write the PID to pidfile")
    (options, args) = parser.parse_args()
    daemon = EmailSender(options.logfile, options.pidfile)
    if len(args) == 0:
        daemon.run()
    elif len(args) == 1:
        if 'start' == args[0]:
            daemon.start()
        elif 'stop' == args[0]:
            daemon.stop()
        elif 'restart' == args[0]:
            daemon.restart()
        else:
            print "Unknown command"
            sys.exit(2)
        sys.exit(0)
    else:
        print "usage: %s start|stop|restart" % sys.argv[0]
        sys.exit(2)