Subversion Repositories SmartDukaan

Rev

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