import smtplib
import os
from ace.config import settings
from jinja2 import Environment, FileSystemLoader, TemplateNotFound
from email.mime.text import MIMEText
import logging
[docs]
class SMTPConnector:
[docs]
def __init__(
self,
host: str = settings.SMTP_HOST,
port: int = settings.SMTP_PORT,
user: str = settings.SMTP_USERNAME,
password: str = settings.SMTP_PASSWORD
):
self.host = host
self.port = port
self.user = user
self.password = password
self.server = None
[docs]
def connect(self):
try:
self.server = smtplib.SMTP(self.host, self.port)
self.server.starttls()
self.server.ehlo()
self.server.login(self.user, self.password)
logging.info(f"Connected to SMTP server: {self.host}:{self.port}")
except Exception as e:
logging.error(f"Failed to connect to SMTP server: {e}")
[docs]
def disconnect(self):
if self.server:
self.server.quit()
logging.info("Disconnected from SMTP server")
[docs]
def send_email(
smtp_connector: SMTPConnector,
_to: str,
_from: str,
subject: str,
template: str,
context: dict,
):
template_builder = TemplateBuilder()
context = {**context, "subject": subject}
html_body = template_builder.render(template, context)
msg = MIMEText(html_body, 'html')
msg['Subject'] = subject
msg['From'] = _from
msg['To'] = _to
try:
smtp_connector.connect()
smtp_connector.server.send_message(msg)
smtp_connector.disconnect()
except smtplib.SMTPException as e:
logging.error(f"Failed to send email: {e}")
[docs]
class TemplateBuilder:
[docs]
def __init__(self):
template_path = settings.EMAIL_TEMPLATE_PATH
self.env = Environment(
loader=FileSystemLoader(os.path.abspath(template_path)),
autoescape=True
)
self.base_template = "example.html"
[docs]
def render(self, template_name: str, context: dict) -> str:
tpl_name = template_name or self.base_template
try:
template = self.env.get_template(tpl_name)
except TemplateNotFound:
template = self.env.get_template(self.base_template)
return template.render(**context)