|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
- # MIT License. See license.txt
-
- from __future__ import unicode_literals
-
- import webnotes
- import smtplib
- import _socket
- from webnotes.utils import cint
-
- def send(email, as_bulk=False):
- """send the message or add it to Outbox Email"""
- if webnotes.flags.mute_emails or webnotes.conf.get("mute_emails") or False:
- webnotes.msgprint("Emails are muted")
- return
-
- try:
- smtpserver = SMTPServer()
- if hasattr(smtpserver, "always_use_login_id_as_sender") and \
- cint(smtpserver.always_use_login_id_as_sender) and smtpserver.login:
- if not email.reply_to:
- email.reply_to = email.sender
- email.sender = smtpserver.login
-
- smtpserver.sess.sendmail(email.sender, email.recipients + (email.cc or []),
- email.as_string())
-
- except smtplib.SMTPSenderRefused:
- webnotes.msgprint("""Invalid Outgoing Mail Server's Login Id or Password. \
- Please rectify and try again.""")
- raise
- except smtplib.SMTPRecipientsRefused:
- webnotes.msgprint("""Invalid Recipient (To) Email Address. \
- Please rectify and try again.""")
- raise
-
- class SMTPServer:
- def __init__(self, login=None, password=None, server=None, port=None, use_ssl=None):
- # get defaults from control panel
- try:
- es = webnotes.doc('Email Settings','Email Settings')
- except webnotes.DoesNotExistError:
- es = None
-
- self._sess = None
- if server:
- self.server = server
- self.port = port
- self.use_ssl = cint(use_ssl)
- self.login = login
- self.password = password
- elif es and es.outgoing_mail_server:
- self.server = es.outgoing_mail_server
- self.port = es.mail_port
- self.use_ssl = cint(es.use_ssl)
- self.login = es.mail_login
- self.password = es.mail_password
- self.always_use_login_id_as_sender = es.always_use_login_id_as_sender
- else:
- self.server = webnotes.conf.get("mail_server") or ""
- self.port = webnotes.conf.get("mail_port") or None
- self.use_ssl = cint(webnotes.conf.get("use_ssl") or 0)
- self.login = webnotes.conf.get("mail_login") or ""
- self.password = webnotes.conf.get("mail_password") or ""
-
- @property
- def sess(self):
- """get session"""
- if self._sess:
- return self._sess
-
- # check if email server specified
- if not self.server:
- err_msg = 'Outgoing Mail Server not specified'
- webnotes.msgprint(err_msg)
- raise webnotes.OutgoingEmailError, err_msg
-
- try:
- if self.use_ssl and not self.port:
- self.port = 587
-
- self._sess = smtplib.SMTP((self.server or "").encode('utf-8'),
- cint(self.port) or None)
-
- if not self._sess:
- err_msg = 'Could not connect to outgoing email server'
- webnotes.msgprint(err_msg)
- raise webnotes.OutgoingEmailError, err_msg
-
- if self.use_ssl:
- self._sess.ehlo()
- self._sess.starttls()
- self._sess.ehlo()
-
- if self.login:
- ret = self._sess.login((self.login or "").encode('utf-8'),
- (self.password or "").encode('utf-8'))
-
- # check if logged correctly
- if ret[0]!=235:
- webnotes.msgprint(ret[1])
- raise webnotes.OutgoingEmailError, ret[1]
-
- return self._sess
-
- except _socket.error:
- # Invalid mail server -- due to refusing connection
- webnotes.msgprint('Invalid Outgoing Mail Server or Port. Please rectify and try again.')
- raise
- except smtplib.SMTPAuthenticationError:
- webnotes.msgprint("Invalid Outgoing Mail Server's Login Id or Password. \
- Please rectify and try again.")
- raise
- except smtplib.SMTPException:
- webnotes.msgprint('There is something wrong with your Outgoing Mail Settings. \
- Please contact us at support@erpnext.com')
- raise
-
|