import smtplib from email.mime.text import MIMEText from app.config import settings import hashlib from typing import List, Tuple def choose_subject(email: str, subject_a: str, subject_b: str) -> Tuple[str, str]: # 受信者でハッシュ→安定的にA/B割当(50/50) h = hashlib.sha256(email.encode()).digest()[0] variant = "A" if (h % 2 == 0) else "B" return (subject_a if variant == "A" else subject_b), variant def send_email(recipients: List[str], subject_a: str, subject_b: str, body_md: str) -> list: results = [] for rcpt in recipients: subject, variant = choose_subject(rcpt, subject_a, subject_b) msg = MIMEText(body_md, _subtype="plain", _charset="utf-8") msg["Subject"] = subject msg["From"] = settings.EMAIL_FROM msg["To"] = rcpt with smtplib.SMTP(settings.SMTP_HOST, settings.SMTP_PORT) as s: s.starttls() if settings.SMTP_USERNAME and settings.SMTP_PASSWORD: s.login(settings.SMTP_USERNAME, settings.SMTP_PASSWORD) s.sendmail(settings.SMTP_USERNAME or "", [rcpt], msg.as_string()) results.append({"to": rcpt, "variant": variant, "subject": subject}) return results