import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from app.core.config import settings import logging logger = logging.getLogger(__name__) class EmailService: def send_email(self, to_email: str, subject: str, body: str): if not settings.SMTP_USER or settings.SMTP_USER == "your-email@gmail.com": logger.warning("SMTP not configured, skipping email sending.") print(f"--- Mock Email ---\nTo: {to_email}\nSubject: {subject}\nBody: {body}\n------------------") return try: msg = MIMEMultipart() msg['From'] = f"{settings.EMAILS_FROM_NAME} <{settings.EMAILS_FROM_EMAIL}>" msg['To'] = to_email msg['Subject'] = subject msg.attach(MIMEText(body, 'html')) server = smtplib.SMTP(settings.SMTP_HOST, settings.SMTP_PORT) server.starttls() server.login(settings.SMTP_USER, settings.SMTP_PASSWORD) text = msg.as_string() server.sendmail(settings.EMAILS_FROM_EMAIL, to_email, text) server.quit() logger.info(f"Email sent to {to_email}") except Exception as e: logger.error(f"Failed to send email: {e}") raise e def send_verification_email(self, to_email: str, code: str): subject = "验证您的邮箱 - Designer" body = f"""

欢迎注册 Designer

您的验证码是:{code}

请输入此验证码完成注册。如果您没有请求此代码,请忽略此邮件。

""" self.send_email(to_email, subject, body) def send_reset_password_email(self, to_email: str, token: str): subject = "重置密码 - Designer" body = f"""

重置密码

您收到了这封邮件是因为您(或者其他人)请求重置您的账户密码。

您的重置验证码是:{token}

请在重置密码页面输入此验证码。

如果您没有请求重置密码,请忽略此邮件。

""" self.send_email(to_email, subject, body) email_service = EmailService()