import smtplib import random import string from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from flask import current_app import logging # 配置日志 logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger(__name__) # 配置邮件发送功能 def send_verification_email(to_email, verification_code): """ 发送验证码邮件 """ try: # 从应用配置获取邮件设置 email_host = current_app.config['EMAIL_HOST'] email_port = current_app.config['EMAIL_PORT'] email_username = current_app.config['EMAIL_USERNAME'] email_password = current_app.config['EMAIL_PASSWORD'] email_from = current_app.config['EMAIL_FROM'] email_from_name = current_app.config['EMAIL_FROM_NAME'] logger.info(f"准备发送邮件到: {to_email}, 验证码: {verification_code}") logger.debug(f"邮件配置: 主机={email_host}, 端口={email_port}") # 邮件内容 msg = MIMEMultipart() msg['From'] = f"{email_from_name} <{email_from}>" msg['To'] = to_email msg['Subject'] = "图书管理系统 - 验证码" # 邮件正文 body = f"""

图书管理系统 - 邮箱验证

您好,

感谢您注册图书管理系统,您的验证码是:

{verification_code}

该验证码将在10分钟内有效,请勿将验证码分享给他人。

如果您没有请求此验证码,请忽略此邮件。

此邮件为系统自动发送,请勿回复。

© 2025 图书管理系统

""" msg.attach(MIMEText(body, 'html')) logger.debug("尝试连接到SMTP服务器...") # 连接服务器发送邮件 server = smtplib.SMTP(email_host, email_port) server.set_debuglevel(1) # 启用详细的SMTP调试输出 logger.debug("检查是否需要STARTTLS加密...") if current_app.config.get('EMAIL_ENCRYPTION') == 'starttls': logger.debug("启用STARTTLS...") server.starttls() logger.debug(f"尝试登录邮箱: {email_username}") server.login(email_username, email_password) logger.debug("发送邮件...") server.send_message(msg) logger.debug("关闭连接...") server.quit() logger.info(f"邮件发送成功: {to_email}") return True except Exception as e: logger.error(f"邮件发送失败: {str(e)}", exc_info=True) return False def generate_verification_code(length=6): """ 生成数字验证码 """ return ''.join(random.choice(string.digits) for _ in range(length))