Files
nonye/back/blueprints/yzm.py
2025-07-17 23:13:04 +08:00

99 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# blueprints/yzm.py
import random
import smtplib
import string
import ssl
import time
from email.mime.text import MIMEText
from flask import request, jsonify, Blueprint
from flask_cors import CORS
bp = Blueprint('yzm', __name__)
CORS(bp, supports_credentials=True)
verification_codes = {}
def generate_code():
return ''.join(random.choices(string.digits, k=6))
def send_email(receiver, code):
sender = '3492073524@qq.com'
password = 'xhemkcgrgximchcd'
msg = MIMEText(f'您的验证码是:{code}5分钟内有效。')
msg['From'] = sender
msg['To'] = receiver
msg['Subject'] = '禾境智联后台管理系统 - 验证码'
max_retries = 3
for attempt in range(1, max_retries + 1):
try:
print(f"[尝试 {attempt}/{max_retries}] 正在连接 SMTP 服务器...")
context = ssl.create_default_context()
with smtplib.SMTP_SSL('smtp.qq.com', 465, context=context) as server:
print("✅ SMTP 连接成功")
server.login(sender, password)
print("🔑 登录成功")
server.sendmail(sender, receiver, msg.as_string())
print("📧 邮件发送成功")
return True # 成功发送
except smtplib.SMTPAuthenticationError as e:
print(f"❌ 认证失败(授权码错误): {str(e)}")
return False
except smtplib.SMTPConnectError as e:
print(f"❌ 连接失败: {str(e)}")
except smtplib.SMTPException as e:
error_msg = str(e)
if error_msg == "(-1, b'\\x00\\x00\\x00')" or "unexpected EOF" in error_msg:
print("⚠️ 警告: 忽略非致命异常,假设邮件已发送成功")
return True # 假设邮件已成功发送
else:
print(f"❌ SMTP 异常: {error_msg}")
except Exception as e:
print(f"❌ 未知错误: {str(e)}")
if attempt < max_retries:
print("🔄 正在等待重试...")
time.sleep(2)
else:
print("💥 达到最大重试次数,邮件发送失败")
return False
@bp.route("/captcha/email", methods=["POST"])
def send_code():
data = request.json
email = data.get("email")
if not email:
return jsonify({"message": "邮箱不能为空"}), 400
code = generate_code()
verification_codes[email] = code
print(f"验证码已生成: {email} -> {code}")
if send_email(email, code):
return jsonify({"message": "验证码已发送"}), 200
else:
return jsonify({"message": "邮件发送失败"}), 500
@bp.route("/captcha/verify", methods=["POST"])
def verify_code():
data = request.json
email = data.get("email")
user_code = data.get("code")
if not email or not user_code:
return jsonify({"message": "参数错误", "valid": False}), 400
stored_code = verification_codes.get(email)
if stored_code and stored_code == user_code:
del verification_codes[email]
return jsonify({"valid": True}), 200
else:
return jsonify({"valid": False}), 400