from fastapi import HTTPException from config import email_settings from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart def _build_verification_email(token: str) -> str: """构建验证邮件HTML内容""" verify_url = f"{email_settings.base_url.rstrip('/')}/users/verify-email?token={token}" return f"""

📧 邮箱验证

感谢注册!请点击下方按钮完成邮箱验证:

点击验证邮箱

或者复制以下链接到浏览器打开:

{verify_url}

链接有效期为30分钟,请尽快完成验证。

""" async def send_verification_email(to_email: str, token: str) -> bool: """发送邮箱验证链接""" try: import aiosmtplib msg = MIMEMultipart("alternative") msg["Subject"] = "邮箱验证 - 图书管理系统" msg["From"] = email_settings.from_addr msg["To"] = to_email msg.attach(MIMEText(_build_verification_email(token), "html", "utf-8")) await aiosmtplib.send( msg, hostname=email_settings.smtp_host, port=email_settings.smtp_port, username=email_settings.smtp_user, password=email_settings.smtp_password, use_tls=email_settings.use_tls, ) return True except ImportError: # aiosmtplib 未安装时降级使用标准库 smtplib import smtplib msg = MIMEMultipart("alternative") msg["Subject"] = "邮箱验证 - 图书管理系统" msg["From"] = email_settings.from_addr msg["To"] = to_email msg.attach(MIMEText(_build_verification_email(token), "html", "utf-8")) if email_settings.use_tls: server = smtplib.SMTP_SSL(email_settings.smtp_host, email_settings.smtp_port) else: server = smtplib.SMTP(email_settings.smtp_host, email_settings.smtp_port) server.login(email_settings.smtp_user, email_settings.smtp_password) server.sendmail(email_settings.from_addr, to_email, msg.as_string()) server.quit() return True except Exception as e: raise HTTPException( status_code=500, detail="邮件发送失败,请稍后重试", )