Files
outlookEmailPlus/docs/待办事项.md
T
胡绍康andClaude Opus 4.6 64d8a6c357 feat(multi-mailbox): 实现多邮箱统一管理功能(PRD-00005)
核心变更:
- 数据库:Schema v3,accounts 表新增 account_type/provider/imap_host/imap_port/imap_password 字段
- 后端:新增通用 IMAP 服务(imap_generic.py)与邮箱提供商配置(providers.py)
- 导入:支持 Outlook/QQ/163/Gmail/自定义 IMAP 多格式批量导入,兼容注释行与导出格式
- 导出:按邮箱类型分组导出,保留 provider 信息便于重新导入
- 邮件读取:IMAP 账号走通用 IMAP 服务,Outlook 保持原 Graph/XOAUTH2 链路
- 验证码提取:IMAP 账号通过 IMAP 获取邮件详情后提取
- 安全约束:IMAP 账号禁用远程删除,敏感字段(imap_password)加密存储
- 前端:新增邮箱类型下拉、自定义 IMAP 配置区、provider 标签显示
- 调度器:定时刷新仅处理 Outlook 账号(IMAP 无 OAuth token 刷新语义)
- 日志:配置 outlook_web 命名空间日志输出到 stderr

技术细节:
- 保持 Outlook 旧格式完全兼容(四段式:email----password----client_id----refresh_token)
- IMAP 账号使用空字符串占位 client_id/refresh_token(满足 DB NOT NULL 约束)
- 支持导出格式智能识别(5 段 custom、3 段 provider、2 段配合输入框)
- 前端 DOMPurify 未加载时回退为基本 HTML 过滤(CDN 不可达场景)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 22:54:39 +08:00

3.3 KiB
Raw Blame History

待办事项(Backlog)

最后更新:2026-03-03
说明:用于记录已完成需求后的遗留问题、技术债与下一步优化项(按优先级排序)。


TODO-00005|多邮箱统一管理 — 遗留问题/技术债

总体评价

P0 主链路已完成并通过全量单测回归(导入/导出/邮件列表/详情/验证码提取/IMAP 禁删/调度任务跳过 IMAP)。
当前主要风险集中在 IMAP(Generic) 列表拉取的性能 与 前后端 provider 展示的单一数据源。

具体问题列表(按严重程度排序)

  1. IMAP(Generic) 邮件列表拉取性能/带宽风险(高)
  • 现状:outlook_web/services/imap_generic.py 列表为生成 body_preview 与 has_attachments,对每封邮件使用 UID FETCH ... RFC822 拉取整封邮件。
  • 影响:遇到大邮件/多邮件时列表加载显著变慢;后端 CPU/内存/网络开销偏大;可能触发 IMAP 服务端限流/断连。
  • 关联文件:outlook_web/services/imap_generic.py
  1. IMAP 账号“编辑/刷新”链路未适配(中)
  • 现状:前端编辑账号校验仍强制 client_id/refresh_token;Repo 的 update_account() 也要求非空,IMAP 账号不满足。
  • 影响:IMAP 账号导入后若需修改授权码/服务器配置,缺少一致的编辑入口(只能删除重导)。
  • 关联文件:static/js/features/accounts.js、outlook_web/repositories/accounts.py、outlook_web/controllers/accounts.py
  1. provider label 存在“双维护”(低)
  • 现状:后端 MAIL_PROVIDERS 定义 label;前端 getProviderLabel() 又硬编码一份。
  • 影响:后续新增/修改 provider 文案容易不一致。
  • 关联文件:outlook_web/services/providers.py、static/js/features/groups.js
  1. IMAP 连接超时设置的全局副作用(低)
  • 现状:为兼容旧版本 imaplib.IMAP4_SSL,在不支持 timeout= 参数时会调用 socket.setdefaulttimeout(30)(全局)。
  • 影响:可能影响进程内其他网络连接的默认超时语义,增加排查成本。
  • 关联文件:outlook_web/services/imap_generic.py

改进建议和示例代码

A) IMAP(Generic) 列表拉取改为“轻量 FETCH”(建议优先)

目标:列表接口只拉取必要信息(FLAGS + HEADER + 预览片段),避免整封 RFC822。

建议方向(伪代码):

# 仅抓取必要字段:FLAGS + 头部 + BODYSTRUCTURE + 正文前 N 字节(按需)
mail.uid(
    "FETCH",
    uid,
    "(FLAGS BODY.PEEK[HEADER.FIELDS (SUBJECT FROM DATE)] BODYSTRUCTURE BODY.PEEK[TEXT]<0.2048>)",
)

验收标准(建议写入任务卡):

  • 列表接口不再使用 RFC822 拉取整封邮件;
  • body_preview 来自 partial fetch(或仅 header+subject 预览兜底);
  • has_attachments 使用 BODYSTRUCTURE/part 判断(或降级为“未知/False”并在详情再判定)。

B) IMAP 账号编辑能力(P1)

建议:

  • 后端为 IMAP 账号新增更新接口或在 update_account() 增加 account_type 分支校验;
  • 前端编辑模态框按 account_type/provider 动态展示字段(授权码/host/port)。

C) provider label 单一来源

建议:

  • 账号列表 tag 展示优先使用 GET /api/providers 返回的 label(由前端缓存映射),移除硬编码 getProviderLabel() 或仅作为兜底。