Subversion Repositories SmartDukaan

Rev

Rev 8111 | Rev 13363 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4795 mandeep.dh 1
from email.mime.text import MIMEText
2
from shop2020.clients.HelperClient import HelperClient
6906 rajveer 3
from shop2020.clients.TransactionClient import TransactionClient
1425 varun.gupt 4
from shop2020.thriftpy.utils.ttypes import Mail
4909 amar.kumar 5
from shop2020.utils.daemon import Daemon
5299 mandeep.dh 6
import optparse
4795 mandeep.dh 7
import sched
8
import smtplib
9
import sys
5299 mandeep.dh 10
import time
6906 rajveer 11
import os
12
from email.MIMEMultipart import MIMEMultipart
13
from email.MIMEBase import MIMEBase
14
from email.MIMEText import MIMEText
15
from email import Encoders
1425 varun.gupt 16
 
17
 
4909 amar.kumar 18
class EmailSender(Daemon):
8056 rajveer 19
    def __init__(self, logfile='/var/log/utils/emailsender/emailsender.log', pidfile='/var/run/email-sender.pid', count = 0):
4909 amar.kumar 20
        Daemon.__init__(self, pidfile, stdout=logfile, stderr=logfile)
3425 varun.gupt 21
        print 'EmailSender initiated at', time.time()
1425 varun.gupt 22
        self.email_schedular = sched.scheduler(time.time, time.sleep)
8111 anupam.sin 23
        self.time_to_sleep = 10
8056 rajveer 24
        self.count = count
8111 anupam.sin 25
        self.exceptionCount = {}
3425 varun.gupt 26
        self.authenticate()
27
 
28
    def authenticate(self):
3400 varun.gupt 29
        try:
5299 mandeep.dh 30
            print "Attempting authentication at ", time.time()
31
            self.sendGridMailServer = smtplib.SMTP("smtp.sendgrid.net", 587)
6016 rajveer 32
            self.sendGridSender = "euser"
5299 mandeep.dh 33
            self.sendGridPassword = "shop2020"
34
            self.sendGridMailServer.ehlo()
35
            self.sendGridMailServer.starttls()
36
            self.sendGridMailServer.ehlo()
37
            self.sendGridMailServer.login(self.sendGridSender, self.sendGridPassword)
38
 
8069 anupam.sin 39
#            self.gmailServer = smtplib.SMTP("smtp.gmail.com", 587)
40
#            self.gmailSender = "help@shop2020.in"
41
#            self.gmailPassword = "5h0p2o2o"
42
#            self.gmailServer.ehlo()
43
#            self.gmailServer.starttls()
44
#            self.gmailServer.ehlo()
45
#            self.gmailServer.login(self.gmailSender, self.gmailPassword)            
3425 varun.gupt 46
            print "Authentication successful", time.time()
3400 varun.gupt 47
 
48
        except smtplib.SMTPConnectError as e:
4795 mandeep.dh 49
            print 'Specified host did not respond correctly', e        
3400 varun.gupt 50
        except smtplib.SMTPHeloError as e:
51
            print 'The server did not reply properly to the HELO greeting.', e
52
        except smtplib.SMTPAuthenticationError as e:
53
            print 'The server did not accept the username/password combination.', e
54
        except smtplib.SMTPException as e:
55
            print e
4795 mandeep.dh 56
        except Exception as e:
57
            print sys.exc_info()[0]
58
            print e
3425 varun.gupt 59
 
6906 rajveer 60
    def get_attachment_part(self, document, filename):
61
        part = MIMEBase('application', 'octet-stream')
62
        part.set_payload(document)
63
        Encoders.encode_base64(part)
6947 rajveer 64
        part.add_header('Content-Disposition', 'attachment; filename=%s' % filename + "-insurance-policy.pdf")
6906 rajveer 65
        return part
66
 
1425 varun.gupt 67
    def sendMail(self, mail):
5864 rajveer 68
        msg = MIMEMultipart()
69
 
70
        msg['From'] = "help@saholic.com"
71
        msg['To'] = ', '.join(mail.emailTo)
72
        msg['Cc'] = ', '.join(mail.cc)
73
        #msg['Bcc'] = ', '.join(mail.bcc)
74
        msg['Subject'] = mail.subject
1425 varun.gupt 75
 
5864 rajveer 76
        html_msg = MIMEText(mail.body, 'html')
77
        msg.attach(html_msg)
6906 rajveer 78
 
79
        if mail.emailType == "DeliverySuccess":
80
            tclient = TransactionClient().get_client()
81
            document = tclient.getDocument(1, int(mail.source))
7040 amar.kumar 82
            if document != bin(0):
6906 rajveer 83
                msg.attach(self.get_attachment_part(document, mail.source))
84
 
3425 varun.gupt 85
        try:
5299 mandeep.dh 86
            self.setMailServerAndPassword(mail)
7550 anupam.sin 87
            rs = self.mailServer.sendmail(self.password, mail.emailTo + mail.cc + mail.bcc + ['backup@saholic.com'], msg.as_string())
3425 varun.gupt 88
        except smtplib.SMTPServerDisconnected as e:
89
            print 'Server Disconnected at', time.time()
90
            self.authenticate()
8066 rajveer 91
            rs = self.mailServer.sendmail(self.password, mail.emailTo + mail.cc + mail.bcc + ['backup@saholic.com'], msg.as_string())
3425 varun.gupt 92
 
93
        print msg['To']
1425 varun.gupt 94
        # Should be mailServer.quit(), but that crashes...
95
        return rs
96
 
5299 mandeep.dh 97
    def setMailServerAndPassword(self, mail):
5828 rajveer 98
        self.mailServer = self.sendGridMailServer
99
        self.password = self.sendGridPassword
100
 
101
#        self.mailServer = self.gmailServer
102
#        self.password = self.gmailPassword
103
#
104
#        for receiver in mail.to:
105
#            if not receiver.endswith('@saholic.com') and not receiver.endswith('@shop2020.in'):
106
#                self.mailServer = self.sendGridMailServer
107
#                self.password = self.sendGridPassword
108
#                break
5299 mandeep.dh 109
 
1425 varun.gupt 110
    def send(self):
8111 anupam.sin 111
        '''
112
        If sending fails for a mail for more than 10 times then we will exit the sender.
113
        This is done to avoid sending a mail many times if one of the address in the 'emailTo' list is wrong.
114
        '''
8056 rajveer 115
        if self.count > 10:
116
            print str(self.count)
117
            print "Number of failed attempts is more than 10. Exiting"
118
            sys.exit()
8111 anupam.sin 119
 
120
        for emailId in self.exceptionCount.keys() :
121
            if self.exceptionCount[emailId] > 10:
8119 anupam.sin 122
                print "Number of exceptions for email id : " + str(emailId) + " is : " + str(self.exceptionCount[emailId]) + ". Exiting"
8111 anupam.sin 123
                sys.exit()
124
 
1425 varun.gupt 125
        print "Despatch stared at ", time.time()
126
        helper_client = HelperClient().get_client()
127
 
3086 rajveer 128
        emails_to_be_dispatched = helper_client.getEmailsToBeSent()
1425 varun.gupt 129
        print len(emails_to_be_dispatched)
130
 
131
        for email in emails_to_be_dispatched:
3977 varun.gupt 132
            try:
8069 anupam.sin 133
                send_result = "error"
5864 rajveer 134
                send_result = self.sendMail(email)
4796 mandeep.dh 135
            except Exception as e:
136
                print sys.exc_info()[0]
137
                print e
8119 anupam.sin 138
                print 'Error occurred sending email with id - ' + str(email.id)
8111 anupam.sin 139
                if self.exceptionCount.has_key(email.id) :
140
                    self.exceptionCount[email.id] = self.exceptionCount[email.id] + 1
141
                else :
142
                    self.exceptionCount[email.id] = 1
143
                continue
4971 mandeep.dh 144
 
145
            if len(send_result) == 0:
146
                print "Sent at", time.time()
147
                helper_client.markEmailAsSent(email.id)
8111 anupam.sin 148
                if self.exceptionCount.has_key(email.id) :
149
                    del self.exceptionCount[email.id]
4971 mandeep.dh 150
            else:
151
                print "Failed sending email. Id:", " Time:", time.time()
8056 rajveer 152
                self.count = self.count + 1
3977 varun.gupt 153
 
1425 varun.gupt 154
        self.email_schedular.enter(self.time_to_sleep, 1, self.send, ())
155
 
4909 amar.kumar 156
    def run(self):
1425 varun.gupt 157
        self.email_schedular.enter(self.time_to_sleep, 1, self.send, ())
158
        self.email_schedular.run()
159
 
4909 amar.kumar 160
if __name__ == "__main__":
161
    parser = optparse.OptionParser()
162
    parser.add_option("-l", "--logfile", dest="logfile",
163
                      type="string",
164
                      help="Log all output to LOG_FILE",
165
                      )
166
    parser.add_option("-i", "--pidfile", dest="pidfile",
167
                      type="string",
168
                      help="Write the PID to pidfile")
169
    (options, args) = parser.parse_args()
8056 rajveer 170
    daemon = EmailSender(options.logfile, options.pidfile, 0)
4909 amar.kumar 171
    if len(args) == 0:
172
        daemon.run()
173
    elif len(args) == 1:
174
        if 'start' == args[0]:
175
            daemon.start()
176
        elif 'stop' == args[0]:
177
            daemon.stop()
178
        elif 'restart' == args[0]:
179
            daemon.restart()
180
        else:
181
            print "Unknown command"
182
            sys.exit(2)
183
        sys.exit(0)
184
    else:
185
        print "usage: %s start|stop|restart" % sys.argv[0]
186
        sys.exit(2)