Subversion Repositories SmartDukaan

Rev

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