import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.utils import formataddr from flask import current_app import logging def _send_email(recipient, subject, html_body): """ 统一的邮件发送内部函数. :param recipient: 收件人邮箱 :param subject: 邮件主题 :param html_body: HTML格式的邮件内容 :return: True if success, False otherwise. """ try: # 创建邮件对象 msg = MIMEMultipart() # 使用 formataddr 来正确编码包含非ASCII字符(如中文)的发件人名称 msg['From'] = formataddr(( current_app.config['EMAIL_FROM_NAME'], current_app.config['EMAIL_FROM'] )) msg['To'] = recipient msg['Subject'] = subject msg.attach(MIMEText(html_body, 'html', 'utf-8')) # 发送邮件 server = smtplib.SMTP(current_app.config['EMAIL_HOST'], current_app.config['EMAIL_PORT']) if current_app.config['EMAIL_ENCRYPTION'] == 'starttls': server.starttls() server.login(current_app.config['EMAIL_USERNAME'], current_app.config['EMAIL_PASSWORD']) server.send_message(msg) server.quit() current_app.logger.info(f"成功发送邮件到: {recipient}, 主题: {subject}") return True except Exception as e: # 统一记录错误日志 current_app.logger.error(f"发送邮件到 {recipient} 失败 (主题: {subject}): {str(e)}") return False def send_verification_email(email, verification_code): """发送注册验证码邮件""" subject = '【儿童语言学习系统】邮箱验证码' body = f"""

儿童语言学习系统

您的验证码

{verification_code}

注意:验证码5分钟内有效,请及时使用。如果不是您本人操作,请忽略此邮件。

安全提示

为了您的账号安全,请不要将验证码泄露给他人。我们不会主动向您索要验证码。

此邮件由系统自动发送,请勿直接回复

© 儿童语言学习系统 - 让孩子快乐学语言

""" return _send_email(email, subject, body) def send_password_reset_email(email, verification_code): """发送密码重置邮件""" subject = '【儿童语言学习系统】密码重置验证码' body = f"""

密码重置

密码重置验证码

{verification_code}

注意:验证码5分钟内有效,请及时使用。如果不是您本人操作,请立即修改密码并联系我们。

重要提醒

如果您没有申请密码重置,请忽略此邮件。为了账号安全,建议您定期更换密码。

此邮件由系统自动发送,请勿直接回复

© 儿童语言学习系统 - 让孩子快乐学语言

""" # 调用统一的发送函数 return _send_email(email, subject, body)