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,7 @@ class RegistrationEngine:
self.session: Optional[cffi_requests.Session] = None
self.session_token: Optional[str] = None # 会话令牌
self.logs: list = []
self._otp_sent_at: Optional[float] = None # OTP 发送时间戳
def _log(self, message: str, level: str = "info"):
"""记录日志"""
@@ -346,6 +347,9 @@ class RegistrationEngine:
def _send_verification_code(self) -> bool:
"""发送验证码"""
try:
# 记录发送时间戳
self._otp_sent_at = time.time()
response = self.session.get(
OPENAI_API_ENDPOINTS["send_otp"],
headers={
@@ -371,7 +375,8 @@ class RegistrationEngine:
email=self.email,
email_id=email_id,
timeout=120,
pattern=OTP_CODE_PATTERN
pattern=OTP_CODE_PATTERN,
otp_sent_at=self._otp_sent_at,
)
if code: