Subversion Repositories SmartDukaan

Rev

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