Skip to content

fix(imap): 修复验证码提取详情错配#67

Open
hongdongjian wants to merge 1 commit into
ZeroPointSix:mainfrom
hongdongjian:fix/imap-verification-detail-mismatch
Open

fix(imap): 修复验证码提取详情错配#67
hongdongjian wants to merge 1 commit into
ZeroPointSix:mainfrom
hongdongjian:fix/imap-verification-detail-mismatch

Conversation

@hongdongjian

Copy link
Copy Markdown

摘要

修复 IMAP 验证码提取时 matched_email_id 与实际提取正文不一致的问题。

修改

  • IMAP 批量 fetch 返回后按请求的 paged_ids 顺序重排。
  • 验证码渠道路由校验 detail.id 与 latest.id,不一致时重新获取详情。
  • 增加乱序返回和 detail/latest 不一致的回归测试。

测试

  • tests.test_imap_connection_reuse: 8 passed
  • VerificationChannelRoutingLogChannelTests: 3 passed
  • git diff --check: passed

Copy link
Copy Markdown
Owner

总体结论:修复方向正确,批量 IMAP 返回按 paged_ids 重排能解决“列表最新但正文取旧”的主因;但 detail 缺失/无 id 时仍可能不触发兜底重取,建议补一处边界处理后再合并。

关键发现:

  • extract_verification_for_outlook() 只在 latest_iddetail_id 都存在且不相等时才重新 fetch_email_detail_for_channel()。如果 IMAP 批量路径返回了 emails,但 detailNone、空对象或缺少 id,当前条件不会重取最新邮件详情,后续仍可能用空 detail 进入验证码提取,导致已有最新邮件但提取失败。
  • 新增测试覆盖了 detail 指向旧邮件的场景,但没有覆盖 detail 缺失/无 id 的场景。这个边界和本次修复目标很接近,建议一起锁住。
  • fetch_and_detail_imap_with_server() 按请求顺序重排批量 fetch 响应是合理的,能避免 IMAP server 返回顺序与请求顺序不一致导致 detail 错配。

优先级建议:

  • 高:将 IMAP 分支的重取条件调整为 latest_id 存在且 detail_id != latest_id 时重取,包括 detail 缺失/无 id 的情况。
  • 中:补一条回归测试:emails 有最新 id,但 detailNone{} 时,应按 latest.id 重取并提取验证码。
  • 低:可以在重取失败时保留清晰日志,便于排查 IMAP detail 二次获取失败。

后续建议:

  • 修正后重跑现有 tests.test_imap_connection_reuse 和验证码渠道路由测试,确认乱序与缺失 detail 两类场景都被覆盖。

Copy link
Copy Markdown
Owner

CodeXWeb 本轮自动巡检已认领,正在处理本 PR 的 review 修改意见。

本轮只会处理这一项:#67。处理范围限定为评论 4677387316 中指出的 IMAP detail 缺失/无 id 时未重取 latest 详情及对应回归测试;不会自动合并。

@ZeroPointSix ZeroPointSix left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CodeXWeb 本轮自动巡检处理结果:已按 review comment 4677387316 做最小修复并验证。

处理内容:

  • 将 IMAP detail 重取条件调整为:只要存在 latest_id 且当前 detail_id != latest_id 就重新按 latest 邮件 id 获取详情,覆盖 detail=None、空对象或无 id 的情况。
  • 新增回归测试 test_imap_missing_detail_refetches_latest_message_detail,覆盖 batch 返回最新邮件列表但未带回 detail 时仍能按 latest id 重取并提取验证码。
  • 已同步更新 WORKSPACE.md 操作记录。

提交状态:

  • 本地提交:3fa2bdf (fix(imap): refetch latest detail when missing)
  • 由于 PR #67 当前 head 仍停在 30dd2f867db43645058c44e8596d78251704f947,且该 PR 作者为 hongdongjian,本轮未能直接更新原 PR head 分支。
  • 我已将同一提交推送到主仓库分支 ZeroPointSix/outlookEmailPlus:fix/imap-verification-detail-mismatch,可用于 cherry-pick 或重新开/替换 PR 分支。

验证:

  • git diff --check:通过
  • .venv/bin/python -m pytest tests/test_imap_connection_reuse.py tests/test_verification_extract_log.py -q:19 passed
  • .venv/bin/python -m compileall -q outlook_web web_outlook_app.py outlook_mail_reader.py start.py tests && .venv/bin/python -m unittest discover -s tests -v:执行完成但退出码 1;本次新增/相关验证码提取用例通过,失败集中在既有真实 CF Worker E2E。
  • .venv/bin/python -m unittest tests.test_pool_cf_real_e2e -v:单独复现 4 failures,首个失败为 UPSTREAM_BAD_PAYLOAD,上游返回 CF Worker 创建邮箱失败 HTTP 400,与本次 IMAP detail 重取改动无直接交集。

本轮未自动合并。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants