"""SMTP sender using smtplib. Sends messages to the submission port (587) of docker-mailserver. """ import mimetypes import smtplib from email.mime.base import MIMEBase from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.utils import formatdate, make_msgid from email import encoders from flask import current_app def send_message( from_email: str, password: str, to_emails: list[str], cc_emails: list[str], bcc_emails: list[str], subject: str, body_html: str, body_text: str = "", important: bool = False, attachments: list | None = None, ) -> bytes: host = current_app.config["SMTP_HOST"] port = int(current_app.config.get("SMTP_PORT", 587)) body_msg = MIMEMultipart("alternative") if body_text: body_msg.attach(MIMEText(body_text, "plain", "utf-8")) body_msg.attach(MIMEText(body_html, "html", "utf-8")) if attachments: msg = MIMEMultipart("mixed") msg.attach(body_msg) for att in attachments: filename = att["filename"] data = att["data"] ctype, _ = mimetypes.guess_type(filename) if ctype is None: ctype = "application/octet-stream" maintype, subtype = ctype.split("/", 1) part = MIMEBase(maintype, subtype) part.set_payload(data) encoders.encode_base64(part) part.add_header("Content-Disposition", "attachment", filename=filename) msg.attach(part) else: msg = body_msg msg["From"] = from_email msg["To"] = ", ".join(to_emails) if cc_emails: msg["Cc"] = ", ".join(cc_emails) msg["Subject"] = subject msg["Date"] = formatdate() msg["Message-ID"] = make_msgid() if important: msg["X-Priority"] = "1" msg["Importance"] = "high" all_recipients = to_emails + cc_emails + bcc_emails raw = msg.as_bytes() smtp = smtplib.SMTP(host, port, timeout=15) try: smtp.ehlo() smtp.login(from_email, password) smtp.sendmail(from_email, all_recipients, raw) finally: smtp.quit() return raw