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
|