Source code for ace.tools.email.utils

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)