Subversion Repositories SmartDukaan

Rev

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