You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

119 line
3.5 KiB

  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. import webnotes
  5. import smtplib
  6. import _socket
  7. from webnotes.utils import cint
  8. def send(email, as_bulk=False):
  9. """send the message or add it to Outbox Email"""
  10. if webnotes.flags.mute_emails or webnotes.conf.get("mute_emails") or False:
  11. webnotes.msgprint("Emails are muted")
  12. return
  13. try:
  14. smtpserver = SMTPServer()
  15. if hasattr(smtpserver, "always_use_login_id_as_sender") and \
  16. cint(smtpserver.always_use_login_id_as_sender) and smtpserver.login:
  17. if not email.reply_to:
  18. email.reply_to = email.sender
  19. email.sender = smtpserver.login
  20. smtpserver.sess.sendmail(email.sender, email.recipients + (email.cc or []),
  21. email.as_string())
  22. except smtplib.SMTPSenderRefused:
  23. webnotes.msgprint("""Invalid Outgoing Mail Server's Login Id or Password. \
  24. Please rectify and try again.""")
  25. raise
  26. except smtplib.SMTPRecipientsRefused:
  27. webnotes.msgprint("""Invalid Recipient (To) Email Address. \
  28. Please rectify and try again.""")
  29. raise
  30. class SMTPServer:
  31. def __init__(self, login=None, password=None, server=None, port=None, use_ssl=None):
  32. # get defaults from control panel
  33. try:
  34. es = webnotes.doc('Email Settings','Email Settings')
  35. except webnotes.DoesNotExistError:
  36. es = None
  37. self._sess = None
  38. if server:
  39. self.server = server
  40. self.port = port
  41. self.use_ssl = cint(use_ssl)
  42. self.login = login
  43. self.password = password
  44. elif es and es.outgoing_mail_server:
  45. self.server = es.outgoing_mail_server
  46. self.port = es.mail_port
  47. self.use_ssl = cint(es.use_ssl)
  48. self.login = es.mail_login
  49. self.password = es.mail_password
  50. self.always_use_login_id_as_sender = es.always_use_login_id_as_sender
  51. else:
  52. self.server = webnotes.conf.get("mail_server") or ""
  53. self.port = webnotes.conf.get("mail_port") or None
  54. self.use_ssl = cint(webnotes.conf.get("use_ssl") or 0)
  55. self.login = webnotes.conf.get("mail_login") or ""
  56. self.password = webnotes.conf.get("mail_password") or ""
  57. @property
  58. def sess(self):
  59. """get session"""
  60. if self._sess:
  61. return self._sess
  62. # check if email server specified
  63. if not self.server:
  64. err_msg = 'Outgoing Mail Server not specified'
  65. webnotes.msgprint(err_msg)
  66. raise webnotes.OutgoingEmailError, err_msg
  67. try:
  68. if self.use_ssl and not self.port:
  69. self.port = 587
  70. self._sess = smtplib.SMTP((self.server or "").encode('utf-8'),
  71. cint(self.port) or None)
  72. if not self._sess:
  73. err_msg = 'Could not connect to outgoing email server'
  74. webnotes.msgprint(err_msg)
  75. raise webnotes.OutgoingEmailError, err_msg
  76. if self.use_ssl:
  77. self._sess.ehlo()
  78. self._sess.starttls()
  79. self._sess.ehlo()
  80. if self.login:
  81. ret = self._sess.login((self.login or "").encode('utf-8'),
  82. (self.password or "").encode('utf-8'))
  83. # check if logged correctly
  84. if ret[0]!=235:
  85. webnotes.msgprint(ret[1])
  86. raise webnotes.OutgoingEmailError, ret[1]
  87. return self._sess
  88. except _socket.error:
  89. # Invalid mail server -- due to refusing connection
  90. webnotes.msgprint('Invalid Outgoing Mail Server or Port. Please rectify and try again.')
  91. raise
  92. except smtplib.SMTPAuthenticationError:
  93. webnotes.msgprint("Invalid Outgoing Mail Server's Login Id or Password. \
  94. Please rectify and try again.")
  95. raise
  96. except smtplib.SMTPException:
  97. webnotes.msgprint('There is something wrong with your Outgoing Mail Settings. \
  98. Please contact us at support@erpnext.com')
  99. raise