跳转至

邮箱共享配置与异步状态验收

历史记录 / Historical record:本文保留当时的计划、研究或验收证据,不代表 0.11 当前能力全集。现行说明见 文档入口;英文入口见 English overview。

日期:2026-10-20。基线 exp 的 493378e4。使用示例邮箱、隔离存储、模拟 IPC;没有读取真实邮件或登录信息,没有访问学校邮箱,也没有发送邮件。

已修复

  • 邮箱改订阅云日历的配置生命周期。初次加载、换账号、更新客户端专用密码、断开连接都会通知邮箱,不再误订阅日程内容变化;挂载页面不会新增配置监听器。
  • 头部缓存记录邮箱归属。旧无归属缓存不再显示,重新拉取;正文只在内存保存,不将客户端专用密码写入邮件缓存。账号或密码变更会清空内存,旧请求即使稍后返回也不能更新新账号。
  • 初始化、同文件夹刷新和同邮件读取合并并发请求。加载更多与刷新按顺序执行,列表去重。不同文件夹的加载与错误独立,磁盘写入串行,避免旧账号慢写覆盖新缓存。缓存走严格文件接口,写失败会显示提示。
  • 搜索可以在等待时取消。切文件夹、切账号、取消或关闭页面后,过时的搜索响应不再替换列表。打开下一封失败时清空上一封正文;连接失败不显示“没有邮件”。
  • 写信迁到 OneGUI Modal、Field、Input、TextArea。实际点击曾发现旧写信弹层的取消按钮被 OneGO 收藏栏拦截;portal 后取消与发送保持可点,关闭恢复到写信按钮。失败保留草稿,防重复提交,不自动重发。已派发的 SMTP 不声称可以撤回。
  • 原生邮箱命令在阻塞工作线程执行,避免同步网络阻塞 IPC 线程。TCP 连接设每地址 10 秒超时,读写和 SMTP 设置 30 秒超时。修复 IMAP 首批 50 封实际取 51 封、到底后重复取第 1 封、空地址组导致 panic,以及搜索换行破坏命令边界的问题。SMTP 保持原来的 465 implicit TLS,只修正错误注释。
  • accountSetup.connectMail 与 ConnectGate 仍复用 configureCloudCal,没有增加第二份邮箱配置。CalDAV 验证与持久化由云日历模块负责。

验证

  • node tools/mail-state-test.mjs:23 个隔离用例通过,执行实际 state/mail.ts。覆盖初始化并发、缓存归属、A→B→A、同号换密码、旧列表/正文/已读/搜索回包、写盘竞态、分页串行、同步 IPC 抛错后重试和发送不自动重试。
  • node tools/mail-browser-test.mjs:30 项通过,1280×844 桌面真实点击与 390×844 手机真实触摸。挂载实际 MailPage 与实际邮箱状态,只替换配置和 IPC,所有远程 URL 被阻止。覆盖搜索取消、文件夹切换、账号切换、正文失败、发送失败保稿、关闭弹窗及焦点恢复。
  • cargo test --lib mail::tests::offline --offline:3 个原生离线测试通过。没有运行 #[ignore] 的真实收发测试。
  • cargo build --offline:主 App 构建自然退出 0,产物 /Volumes/OneTHUBuild/oh-desktop/cargo-target/debug/onethu。本验收没有启动、替换或强退用户 App。
  • 集成后的桌面 TypeScript、UI 文案、OneGUI 与完整动效检查通过。日期时间输入收进 OneGUI Input;动效检查分别保护统一 Modal 和日程的 OneGUI 入场配方。

浏览器报告 · 手机写信窗口 · 桌面邮箱

已人工查看两张最终截图:手机弹窗正文可读、按钮在窗口内,桌面列表与阅读区正常。未验证真实学校 IMAP/SMTP 服务、实际投递、实体手机或 Windows 原生宿主。 浏览器取消只阻止过时结果回到界面,不取消已在原生工作线程执行的网络操作。