Subversion Repositories SmartDukaan

Rev

Rev 13476 | Rev 15006 | 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
 
14927 manish.sha 70
        msg['From'] = mail.emailFrom
5864 rajveer 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()
13363 manish.sha 81
            if '-' in mail.source:
82
                subOrders = tclient.getGroupOrdersByLogisticsTxnId(mail.source)
83
                singleOrderId = 0
84
                for order in subOrders:
85
                    if order.insurer:
86
                        singleOrderId = order.id
87
                        break
88
                if singleOrderId > 0:
13476 kshitij.so 89
                    document = tclient.getDocument(1, int(singleOrderId))
13363 manish.sha 90
                    if document != bin(0):
91
                        msg.attach(self.get_attachment_part(document, mail.source))
92
            else:
93
                document = tclient.getDocument(1, int(mail.source))
94
                if document != bin(0):
95
                    msg.attach(self.get_attachment_part(document, mail.source))
6906 rajveer 96
 
3425 varun.gupt 97
        try:
5299 mandeep.dh 98
            self.setMailServerAndPassword(mail)
7550 anupam.sin 99
            rs = self.mailServer.sendmail(self.password, mail.emailTo + mail.cc + mail.bcc + ['backup@saholic.com'], msg.as_string())
3425 varun.gupt 100
        except smtplib.SMTPServerDisconnected as e:
101
            print 'Server Disconnected at', time.time()
102
            self.authenticate()
8066 rajveer 103
            rs = self.mailServer.sendmail(self.password, mail.emailTo + mail.cc + mail.bcc + ['backup@saholic.com'], msg.as_string())
3425 varun.gupt 104
 
105
        print msg['To']
1425 varun.gupt 106
        # Should be mailServer.quit(), but that crashes...
107
        return rs
108
 
5299 mandeep.dh 109
    def setMailServerAndPassword(self, mail):
5828 rajveer 110
        self.mailServer = self.sendGridMailServer
111
        self.password = self.sendGridPassword
112
 
113
#        self.mailServer = self.gmailServer
114
#        self.password = self.gmailPassword
115
#
116
#        for receiver in mail.to:
117
#            if not receiver.endswith('@saholic.com') and not receiver.endswith('@shop2020.in'):
118
#                self.mailServer = self.sendGridMailServer
119
#                self.password = self.sendGridPassword
120
#                break
5299 mandeep.dh 121
 
1425 varun.gupt 122
    def send(self):
8111 anupam.sin 123
        '''
124
        If sending fails for a mail for more than 10 times then we will exit the sender.
125
        This is done to avoid sending a mail many times if one of the address in the 'emailTo' list is wrong.
126
        '''
8056 rajveer 127
        if self.count > 10:
128
            print str(self.count)
129
            print "Number of failed attempts is more than 10. Exiting"
130
            sys.exit()
8111 anupam.sin 131
 
132
        for emailId in self.exceptionCount.keys() :
133
            if self.exceptionCount[emailId] > 10:
8119 anupam.sin 134
                print "Number of exceptions for email id : " + str(emailId) + " is : " + str(self.exceptionCount[emailId]) + ". Exiting"
8111 anupam.sin 135
                sys.exit()
136
 
1425 varun.gupt 137
        print "Despatch stared at ", time.time()
138
        helper_client = HelperClient().get_client()
139
 
3086 rajveer 140
        emails_to_be_dispatched = helper_client.getEmailsToBeSent()
1425 varun.gupt 141
        print len(emails_to_be_dispatched)
142
 
143
        for email in emails_to_be_dispatched:
3977 varun.gupt 144
            try:
8069 anupam.sin 145
                send_result = "error"
5864 rajveer 146
                send_result = self.sendMail(email)
4796 mandeep.dh 147
            except Exception as e:
148
                print sys.exc_info()[0]
149
                print e
8119 anupam.sin 150
                print 'Error occurred sending email with id - ' + str(email.id)
8111 anupam.sin 151
                if self.exceptionCount.has_key(email.id) :
152
                    self.exceptionCount[email.id] = self.exceptionCount[email.id] + 1
153
                else :
154
                    self.exceptionCount[email.id] = 1
155
                continue
4971 mandeep.dh 156
 
157
            if len(send_result) == 0:
158
                print "Sent at", time.time()
159
                helper_client.markEmailAsSent(email.id)
8111 anupam.sin 160
                if self.exceptionCount.has_key(email.id) :
161
                    del self.exceptionCount[email.id]
4971 mandeep.dh 162
            else:
163
                print "Failed sending email. Id:", " Time:", time.time()
8056 rajveer 164
                self.count = self.count + 1
3977 varun.gupt 165
 
1425 varun.gupt 166
        self.email_schedular.enter(self.time_to_sleep, 1, self.send, ())
167
 
4909 amar.kumar 168
    def run(self):
1425 varun.gupt 169
        self.email_schedular.enter(self.time_to_sleep, 1, self.send, ())
170
        self.email_schedular.run()
171
 
4909 amar.kumar 172
if __name__ == "__main__":
173
    parser = optparse.OptionParser()
174
    parser.add_option("-l", "--logfile", dest="logfile",
175
                      type="string",
176
                      help="Log all output to LOG_FILE",
177
                      )
178
    parser.add_option("-i", "--pidfile", dest="pidfile",
179
                      type="string",
180
                      help="Write the PID to pidfile")
181
    (options, args) = parser.parse_args()
8056 rajveer 182
    daemon = EmailSender(options.logfile, options.pidfile, 0)
4909 amar.kumar 183
    if len(args) == 0:
184
        daemon.run()
185
    elif len(args) == 1:
186
        if 'start' == args[0]:
187
            daemon.start()
188
        elif 'stop' == args[0]:
189
            daemon.stop()
190
        elif 'restart' == args[0]:
191
            daemon.restart()
192
        else:
193
            print "Unknown command"
194
            sys.exit(2)
195
        sys.exit(0)
196
    else:
197
        print "usage: %s start|stop|restart" % sys.argv[0]
198
        sys.exit(2)