核心变更: - 数据库: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>
70 lines
3.3 KiB
Markdown
70 lines
3.3 KiB
Markdown
# 待办事项(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`
|
||
|
||
2) **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`
|
||
|
||
3) **provider label 存在“双维护”(低)**
|
||
- 现状:后端 `MAIL_PROVIDERS` 定义 label;前端 `getProviderLabel()` 又硬编码一份。
|
||
- 影响:后续新增/修改 provider 文案容易不一致。
|
||
- 关联文件:`outlook_web/services/providers.py`、`static/js/features/groups.js`
|
||
|
||
4) **IMAP 连接超时设置的全局副作用(低)**
|
||
- 现状:为兼容旧版本 `imaplib.IMAP4_SSL`,在不支持 `timeout=` 参数时会调用 `socket.setdefaulttimeout(30)`(全局)。
|
||
- 影响:可能影响进程内其他网络连接的默认超时语义,增加排查成本。
|
||
- 关联文件:`outlook_web/services/imap_generic.py`
|
||
|
||
### 改进建议和示例代码
|
||
|
||
#### A) IMAP(Generic) 列表拉取改为“轻量 FETCH”(建议优先)
|
||
|
||
目标:列表接口只拉取必要信息(FLAGS + HEADER + 预览片段),避免整封 RFC822。
|
||
|
||
建议方向(伪代码):
|
||
|
||
```python
|
||
# 仅抓取必要字段: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()` 或仅作为兜底。
|
||
|