Last active
November 3, 2023 14:18
-
-
Save revant/93d56e752183cd26bdb3005847659c48 to your computer and use it in GitHub Desktop.
Python SMTPServer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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