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_registration_notification( admin_email: str, student_name: str, class_name: str ): html = f"""

New Registration Pending Approval

{student_name} has registered for {class_name}.

Please log in to HKU ICB to review and approve.

""" await send_email(admin_email, "HKU ICB: New Registration", html) async def send_approval_notification(student_email: str, approved: bool): status_text = "approved" if approved else "rejected" html = f"""

Registration {status_text.capitalize()}

Your registration has been {status_text}.

{"

You can now log in to HKU ICB.

" if approved else ""} """ await send_email( student_email, f"HKU ICB: Registration {status_text.capitalize()}", 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"""

HKU ICB

{title}

{body}
{action_html}
此邮件由系统自动发送,请勿直接回复。
""" for email in emails: await send_email(email, subject, html)