Files
modoboa/modoboa/lib/smtp_backend.py
T
2025-05-07 08:42:14 +02:00

44 lines
1.6 KiB
Python

"""Custom SMTP email backend."""
from django.core.mail.backends import EmailBackend
from django.core.mail.utils import DNS_NAME
from modoboa.lib import oauth2
class OAuthBearerEmailBackend(EmailBackend):
def open(self):
"""
Ensure an open connection to the email server. Return whether or not a
new connection was required (True or False) or None if an exception
passed silently.
"""
if self.connection:
# Nothing to do if the connection is already open.
return False
# If local_hostname is not specified, socket.getfqdn() gets used.
# For performance, we use the cached FQDN for local_hostname.
connection_params = {"local_hostname": DNS_NAME.get_fqdn()}
if self.timeout is not None:
connection_params["timeout"] = self.timeout
if self.use_ssl:
connection_params["context"] = self.ssl_context
try:
self.connection = self.connection_class(
self.host, self.port, **connection_params
)
# TLS/SSL are mutually exclusive, so only attempt TLS over
# non-secure connections.
if not self.use_ssl and self.use_tls:
self.connection.starttls(context=self.ssl_context)
if self.username and self.password:
token = oauth2.build_oauthbearer_string(self.username, self.password)
self.connection.docmd("AUTH", f"OAUTHBEARER {token.decode('utf-8')}")
return True
except OSError:
if not self.fail_silently:
raise