import logging from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import aiosmtplib from app.config import settings logger = logging.getLogger(__name__) async def send_email(to: str, subject: str, html_body: str) -> bool: """Send HTML email via SMTP. Returns True on success.""" if not settings.smtp_host: logger.info(f"SMTP not configured, skipping email to {to}: {subject}") return False msg = MIMEMultipart("alternative") msg["From"] = f"{settings.smtp_from_name} <{settings.smtp_from_email}>" msg["To"] = to msg["Subject"] = subject msg.attach(MIMEText(html_body, "html")) try: await aiosmtplib.send( msg, hostname=settings.smtp_host, port=settings.smtp_port, username=settings.smtp_user, password=settings.smtp_password, use_tls=True, ) return True except Exception as e: logger.error(f"Failed to send email to {to}: {e}") return False async def send_account_activated_email(member_email: str): html = """
Your HKU ICB account has been activated successfully.
You can now log in to the platform.
""" await send_email(member_email, "HKU ICB: Account Activated", html) async def send_class_notification_email( emails: list[str], subject: str, title: str, body: str, action_url: str | None = None, ): """Send a styled notification email to class members.""" action_html = "" if action_url: action_html = f""" """ html = f"""