99 lines
3.1 KiB
Python
99 lines
3.1 KiB
Python
# 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 |