核心变更: - 数据库: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>
3.3 KiB
3.3 KiB
待办事项(Backlog)
最后更新:2026-03-03
说明:用于记录已完成需求后的遗留问题、技术债与下一步优化项(按优先级排序)。
TODO-00005|多邮箱统一管理 — 遗留问题/技术债
总体评价
P0 主链路已完成并通过全量单测回归(导入/导出/邮件列表/详情/验证码提取/IMAP 禁删/调度任务跳过 IMAP)。
当前主要风险集中在 IMAP(Generic) 列表拉取的性能 与 前后端 provider 展示的单一数据源。
具体问题列表(按严重程度排序)
- IMAP(Generic) 邮件列表拉取性能/带宽风险(高)
- 现状:
outlook_web/services/imap_generic.py列表为生成body_preview与has_attachments,对每封邮件使用UID FETCH ... RFC822拉取整封邮件。 - 影响:遇到大邮件/多邮件时列表加载显著变慢;后端 CPU/内存/网络开销偏大;可能触发 IMAP 服务端限流/断连。
- 关联文件:
outlook_web/services/imap_generic.py
- 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
- provider label 存在“双维护”(低)
- 现状:后端
MAIL_PROVIDERS定义 label;前端getProviderLabel()又硬编码一份。 - 影响:后续新增/修改 provider 文案容易不一致。
- 关联文件:
outlook_web/services/providers.py、static/js/features/groups.js
- 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()或仅作为兜底。