feat(core): 实现了 Outlook 邮箱验证码获取改进方案

1. 增强邮件识别逻辑 (_is_openai_verification_mail)
    - 严格验证发件人必须是 OpenAI
    - 验证主题/正文包含验证关键词
    - 验证收件人匹配目标邮箱
  2. 邮件时间戳过滤
    - 基于 otp_sent_at 过滤发送前的旧邮件
    - 预留 60 秒时钟偏差容忍
  3. 验证码提取优化 (_extract_code_from_mail)
    - 优先从主题提取 6 位数字
    - 语义正则匹配("code is", "验证码")
    - 兜底任意 6 位数字
  4. 验证码去重机制
    - 新增 _used_codes 实例变量
    - 避免重复使用同一验证码
  5. 渐进式邮件检查
    - 前 3 次轮询只检查未读邮件
    - 之后检查所有邮件(避免已读邮件被忽略)
  6. 可配置超时时间
    - 新增配置项 email_code_timeout(默认 120 秒)
    - 新增配置项 email_code_poll_interval(默认 3 秒)
  7. 详细时间戳日志
    - 记录 IMAP 连接耗时
    - 记录邮件搜索耗时
    - 记录总耗时和轮询次数
This commit is contained in:
cnlimiter
2026-03-15 02:43:00 +08:00
parent bf13756e6d
commit e70c99f205
7 changed files with 202 additions and 38 deletions

View File

@@ -118,6 +118,29 @@ OTP_WAIT_TIMEOUT = 120 # 秒
OTP_POLL_INTERVAL = 3 # 秒
OTP_MAX_ATTEMPTS = 40 # 最大轮询次数
# 验证码提取正则(增强版)
# 简单匹配:任意 6 位数字
OTP_CODE_SIMPLE_PATTERN = r"(?<!\d)(\d{6})(?!\d)"
# 语义匹配:带上下文的验证码(如 "code is 123456", "验证码 123456"
OTP_CODE_SEMANTIC_PATTERN = r'(?:code\s+is|验证码[是为]?\s*[:]?\s*)(\d{6})'
# OpenAI 验证邮件发件人
OPENAI_EMAIL_SENDERS = [
"noreply@openai.com",
"no-reply@openai.com",
"@openai.com", # 通配符匹配
]
# OpenAI 验证邮件关键词
OPENAI_VERIFICATION_KEYWORDS = [
"verify your email",
"verification code",
"验证码",
"your openai code",
"code is",
"one-time code",
]
# 密码生成
PASSWORD_CHARSET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
DEFAULT_PASSWORD_LENGTH = 12