""" SMTP Sender — sends real emails via SMTP (e.g., to Mailpit for dev). Uses standard smtplib. Configuration via environment variables: SMTP_HOST (default: localhost) SMTP_PORT (default: 1025) SMTP_FROM_NAME (default: BreakPilot Compliance) SMTP_FROM_ADDR (default: compliance@breakpilot.local) """ import logging import os import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText logger = logging.getLogger(__name__) SMTP_HOST = os.environ.get("SMTP_HOST", "localhost") SMTP_PORT = int(os.environ.get("SMTP_PORT", "1025")) SMTP_FROM_NAME = os.environ.get("SMTP_FROM_NAME", "BreakPilot Compliance") SMTP_FROM_ADDR = os.environ.get("SMTP_FROM_ADDR", "compliance@breakpilot.local") def send_email( recipient: str, subject: str, body_html: str, from_addr: str | None = None, from_name: str | None = None, ) -> dict: """Send an email via SMTP. Returns dict with status and message_id.""" sender_addr = from_addr or SMTP_FROM_ADDR sender_name = from_name or SMTP_FROM_NAME msg = MIMEMultipart("alternative") msg["From"] = f"{sender_name} <{sender_addr}>" msg["To"] = recipient msg["Subject"] = subject msg.attach(MIMEText(body_html, "html", "utf-8")) try: with smtplib.SMTP(SMTP_HOST, SMTP_PORT, timeout=10) as server: server.sendmail(sender_addr, [recipient], msg.as_string()) logger.info("Email sent to %s: %s", recipient, subject) return {"status": "sent", "recipient": recipient, "subject": subject} except Exception as e: logger.error("Failed to send email to %s: %s", recipient, e) return {"status": "failed", "recipient": recipient, "error": str(e)}