Skip to content

Instantly share code, notes, and snippets.

@revant
Last active November 3, 2023 14:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save revant/93d56e752183cd26bdb3005847659c48 to your computer and use it in GitHub Desktop.
Save revant/93d56e752183cd26bdb3005847659c48 to your computer and use it in GitHub Desktop.
Python SMTPServer
# https://github.com/frappe/frappe/blob/develop/frappe/email/smtp.py
import smtplib
class SMTPServer:
def __init__(
self,
server,
login=None,
password=None,
port=None,
use_tls=None,
use_ssl=None,
):
self.login = login
self.password = password
self._server = server
self._port = port
self.use_tls = use_tls
self.use_ssl = use_ssl
self._session = None
if not self.server:
print(
"Email Account not setup. Please create a new Email Account from Setup > Email > Email Account"
)
raise "OutgoingEmailError"
@property
def port(self):
port = self._port or (self.use_ssl and 465) or (self.use_tls and 587)
return int(port)
@property
def server(self):
return str(self._server or "")
def secure_session(self, conn):
"""Secure the connection incase of TLS."""
if self.use_tls:
conn.ehlo()
conn.starttls()
conn.ehlo()
@property
def session(self):
if self.is_session_active():
return self._session
SMTP = smtplib.SMTP_SSL if self.use_ssl else smtplib.SMTP
try:
_session = SMTP(self.server, self.port)
if not _session:
print(
"Could not connect to outgoing email server"
)
raise "OutgoingEmailError"
self.secure_session(_session)
if self.password:
res = _session.login(str(self.login or ""), str(self.password or ""))
# check if logged correctly
if res[0] != 235:
print(res[1])
raise "OutgoingEmailError"
self._session = _session
return self._session
except smtplib.SMTPAuthenticationError:
print("SMTPAuthenticationError")
except OSError:
# Invalid mail server -- due to refusing connection
print("Invalid Outgoing Mail Server or Port")
raise "Incorrect Configuration"
def is_session_active(self):
if self._session:
try:
return self._session.noop()[0] == 250
except Exception:
return False
def quit(self):
if self.is_session_active():
self._session.quit()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment