Nmail Nmail v0.4.7

Nmail 产品方案(v0.3)

AI 驱动的本地聚合邮箱客户端 · 本地优先 · 隐私自持 · MIT 开源

版本与状态:变更明细见 CHANGELOG.md;架构现状见 ARCHITECTURE.md。 v0.4 改版(2026-09-12 定稿;「v0.4」为该轮改版的计划代号,改版主体已于同日随 v0.3.0 发布):导航重设计(砍侧栏、邮件基座+小按钮开页签)、文件管理器式邮件、每账号服务器端 Archived 归档、草稿体系合并、通讯录、AI 总管家 2.0(审批/自动双模式)、对外 API、内置 OAuth 快速授权、官网 nmail.whizzzest.com——完整方案与决策记录(D1–D7)见 REDESIGN_PLAN.md,落地按其 §13 P1–P8 推进。本文档以下条目已被本轮改版修订:§2 原则 1(通讯录)、§3.4(自动助理提前)、§8 路线图、§10 决策 1/2(归档语义与自动助理)。 当前进度(2026-09-14):v0.4 改版 P1–P8 主体已落地并随 v0.3.0 发布(2026-09-12,PyPI / Homebrew / GitHub Release);发布后持续收尾打磨(品牌区与树折叠、FLAGS 对账、代理跟随系统、新用户初始化定版等);v0.4.x Agent 化已落地(2026-09-14,REDESIGN_PLAN §17:原生 function calling、可恢复长链、工具集对齐人人能力、Claude 式过程展示,详见 §11);其余远期项未开始。


1. 产品定位

Nmail 是一个跑在本机上的邮箱客户端,内置 AI 助理,帮你把邮箱变成”只看值得看的邮件”。

  • 你只管看信、写信、拍板;AI 负责分类、过滤噪音、预先写好草稿、每天给你汇报。
  • 数据全部留在本机(SQLite),不依赖任何云端服务;AI 用你自己的 OpenAI 兼容 API key,也可以指向 Ollama / LM Studio 实现 100% 本地推理。
  • 纯客户端:通过 IMAP/SMTP 收发邮件,不自建任何邮件服务器底层。
  • 跨平台:Python 后端 + 浏览器前端(localhost),Windows / macOS / Linux 通吃;核心只依赖跨平台技术,不调用操作系统独有 API。

2. 设计原则(硬约束)

#原则说明
1只做邮件收、发、读、搜、分类、归档。明确不做日历、联系人 CRM、任务管理、聊天(反面教材:Outlook)。v0.4 修订:轻量通讯录(自动采集+写信补全)属邮件核心体验,非 CRM
2本地优先邮件、索引、AI 记录全部存本地 SQLite;无云端账号体系
3AI 自带钥匙用户自行填写 OpenAI 兼容端点(base_url + key + model),支持本地模型
4AI 分类先行不自建规则引擎;AI 承担全部智能分类,仅有发件人白/黑名单作为零成本补充
5人在回路默认AI 对邮箱的”写操作”分级授权,默认一切发送须经人工审核
6跨端优先不使用任何 OS 独有 API:密钥存本地文件、通知走浏览器 Notification API、无托盘/注册表/launchd
7无服务器不部署任何服务端,只有一个本机进程 + 浏览器页面
8MIT 开源全新代码库;参考项目仅借鉴思想,不搬运受限许可的代码

3. 功能清单

3.1 邮箱核心(P1,MVP 主体)

  • 多账号聚合:添加账号时按邮箱地址自动匹配服务商预设(QQ / 163 / Gmail / Outlook / iCloud 等 30+,含中文服务商授权码说明),也可手动填 IMAP/SMTP;所有账号统一收件箱 + 按账号/文件夹切换。
  • 收信:定时轮询(默认 5 分钟,可配 1–60 分钟)+ 手动刷新;基于 UID 的增量同步,处理 UIDVALIDITY 变化;IMAP 断线自动重连。轮询不丢邮件(原理见 §7)。
  • 读信:会话线程视图;HTML 邮件消毒 + iframe sandbox 渲染;默认拦截远程图片(防追踪像素,点击才加载);附件列表 / 下载 / 图片和 PDF 预览。
  • 发信:新邮件 / 回复 / 回复全部 / 转发;正文支持 Markdown 自动转 HTML;签名(每账号可选);附件;(可选)定时发送、5 秒撤回——借鉴 MiNiMail。
  • 搜索:SQLite FTS5 全文(含中文处理)+ 筛选器(账号 / 文件夹 / 已读 / 星标 / 分类 / 重要度 / 时间 / 发件人)。
  • 管理:已读 / 星标 / 移动 / 删除 / 归档;本地标签(tag);批量操作。
  • 账号健康:连接失败、授权码失效时账号标红 + 通知”授权码可能已过期”,设置页给出对应服务商重新授权指引。

3.2 AI 能力(P2)

  • AI 分类(先行,无规则引擎):新邮件按批次(约 20 封/请求)送 AI,一次调用输出全部结构化结果:
    • 类别:工作 / 个人 / 通知 / 验证码 / 营销订阅 / 社交
    • 重要度:critical / high / normal / low
    • 是否需要回复 + 一句”为什么”
    • 参考实现:mailmind 的 ClassificationService(MIT,~170 行,few-shot + JSON 输出)
  • 零成本静态过滤(不是规则引擎,就是两个集合):
    • 白名单:指定发件人永远进收件箱 + 立即通知,跳过 AI 等待
    • 黑名单:指定发件人直接归档,跳过 AI
    • 在邮件上右键即可”以后收这个人always通知/直接归档”,无需任何规则管理界面
  • 无 AI 兜底:未配置 AI 端点时,全部邮件进收件箱、不分类、功能不受影响(诚实降级,不假装智能)。
  • 营销邮件自动归档:AI 判定为营销/订阅 → 移出聚合收件箱进”已归档”视图。按账号可开关。默认仅本地视图(服务器不动),可选同步到服务器归档文件夹。
  • 新邮件自动草稿:判定”需要回复”→ 立即按账号权限生成回复草稿,通知”草稿已就绪”。草稿语言跟随来信语言。
  • AI 对话面板:随时唤起,上下文可以是”当前邮件 / 会话 / 搜索结果 / 某账号近 N 天”。用途:总结、翻译、提取关键信息(金额、截止日期)、帮你写新邮件。
  • 写作辅助:对任何草稿:润色 / 改写 / 翻译 / 调整语气(更正式 / 更委婉 / 更简短)。
  • Tone DNA(P3+,借鉴 mailmind):从该账号已发邮件学习你的用词、正式度、署名习惯,注入草稿提示词,让 AI 草稿像你写的。
  • AI 用量透明:每次调用记录任务类型、模型、token 用量、估算成本;设置页统计面板;可设每日调用预算上限。

3.3 每日摘要(P3)

每天定时(默认 08:30,可配)AI 生成结构化摘要:

  • 今日概览:新邮件总数、未读数、分类分布(环形图)、近 7 天趋势(折线)、各账号分布
  • 需要回复清单:借鉴 inbox-zero 的 Reply Zero 思想,双清单——“等你回复的” + “等对方回复的(已跟进)”
  • 重要邮件高亮:验证码、账单、截止日期、重要联系人
  • AI 已处理:自动归档 N 封营销邮件(可展开明细)
  • 一键直达对应邮件/草稿;可导出 Markdown

呈现:摘要页(卡片 + ECharts 图表)+ 浏览器通知(页面开着时弹出;页面关闭则进应用内通知中心,打开即见红点)。

3.4 账号级 AI 权限(P3,模型现在就定,实现分步)

每账号独立三档:

档位AI 能做什么状态
只读摘要只能读取、总结、分类;不写草稿、不归档P3
草稿待审(默认)自动归档营销邮件 + 生成回复草稿;发送必须人工审核P2 起
自动助理(agent mail)低风险回复可直接发送:发件人有历史往来 + 无未识别链接/附件 + 简短确认类。所有自动发送留痕可查远期(P4+),开启需二次确认

自动助理正是”agent mail”场景的核心:专门给 AI 建一个邮箱、全自动收发。权限模型现在按三档设计到位,实现放远期——先把基础做稳。 v0.4 修订:自动助理提前至 P6 落地;默认仅「AI 专属邮箱」开启自动(普通账号手动开,二次确认);三档权限升级为五位细粒度授权(REDESIGN_PLAN §6.4)。

3.5 安全与隐私(全跨平台,无 OS 独有 API)

  • 密钥存储:本地配置文件(应用数据目录,SQLite/JSON),文档明示位置;远期可选”主密码加密”(纯跨平台算法 PBKDF2 + Fernet)。不用 DPAPI/keyring 等系统接口。
  • 通知:浏览器 Notification API(Web 标准,三平台一致)+ 应用内通知中心。不用任何系统 toast 库。
  • AI 外发提示:云端 AI 端点会收到邮件正文;设置页明确提示,每账号可单独关 AI;指向 Ollama 等本地端点 = 0 外发。远期可选 PII 脱敏后再调用(借鉴 mailmind 的 pii.py 思路)。
  • HTML 邮件安全:内容消毒 + iframe sandbox + 远程资源默认拦截。
  • 网络:服务仅绑定 127.0.0.1。
  • 数据位置:platformdirs 标准路径(Windows %LOCALAPPDATA%/Nmail),这是跨平台库选择目录,非系统 API。

3.6 明确不做

日历/日程、联系人 CRM、任务管理、聊天 IM、端到端加密邮件、自建邮件服务器、云同步、移动原生 App、多用户/团队协作、插件市场、系统托盘。

4. 系统架构

Nmail/
├─ backend/                    Python 3.11+ · FastAPI
│  └─ app/
│     ├─ main.py               FastAPI 入口,托管前端静态文件
│     ├─ api/                  REST 路由 + SSE(新邮件/草稿/任务实时事件流)
│     ├─ core/
│     │  ├─ imap_client.py     IMAP 收信(imap-tools)、UID 增量同步、断线重连
│     │  ├─ smtp_client.py     发信(MIME、附件、Markdown→HTML)
│     │  ├─ providers.py       服务商预设库(30+)
│     │  └─ sync.py            增量同步引擎(UIDVALIDITY / 软删除处理)
│     ├─ ai/
│     │  ├─ llm.py             OpenAI 兼容客户端(openai SDK,base_url 可覆盖)
│     │  ├─ tasks/             classify.py · draft.py · digest.py · chat.py
│     │  └─ prompts/           提示词模板(用户可自定义覆盖)
│     ├─ pipeline/
│     │  ├─ filters.py         发件人白/黑名单(零成本静态过滤)
│     │  └─ events.py          新邮件事件流水线编排
│     ├─ scheduler.py          APScheduler:定时收信 + 每日摘要 + 健康检查
│     ├─ db/                   SQLite(WAL)+ FTS5 + 版本化迁移
│     └─ security.py           本地密钥文件读写(远期可选主密码加密)
├─ frontend/                   React 18 + Vite + TypeScript
│  ├─ 三栏布局:侧栏(账号/文件夹/分类)│ 邮件列表 │ 阅读区 + 可收起 AI 面板
│  ├─ 页面:聚合收件箱 · 待审草稿 · 已归档 · 每日摘要 · 通知中心 · 设置
│  └─ ECharts 摘要可视化;Notification API 通知
├─ run.py                      一键启动:起服务 + webbrowser 标准库开浏览器
├─ LICENSE                     MIT
└─ docs/

选型理由

选择理由
Python 后端IMAP 生态(imap-tools)最成熟;mailmind(MIT)证明 Python+FastAPI 路线可承载完整 AI 邮件产品;mail-skill 实践经验可平移
FastAPI异步、SSE 原生支持、自动 API 文档
SQLite + FTS5零运维、单文件、十万级邮件无压力(mail-skill 已验证)
APScheduler进程内定时,无外部依赖
React + Vite + TS生态最大,图表库丰富
openai SDK覆盖 base_url → 任意 OpenAI 兼容端点(OpenAI/DeepSeek/Ollama/LM Studio…)
浏览器 Web API(通知等)跨平台一致,零 OS 依赖;将来 Tauri 打包可无缝升级为系统通知
轮询而非 IMAP IDLE各服务商 IDLE 实现差异大、连接易静默假死;轮询每次全新连接,状态干净可靠

5. 数据模型(核心表)

表关键字段
accountsemail, provider, imap/smtp 配置, ai_permission(readonly/draft_review/auto), ai_enabled, 颜色, 健康状态
emailsaccount_id, uid, message_id, folder, subject, sender, recipients, date, body_text, html_path, is_read, starred, category, importance, needs_reply, reply_reason, archived_local, ai_classified_at
sender_listsaccount_id, sender, list_type(whitelist/blacklist) —— 白/黑名单
attachmentsemail_id, filename, mime, size, path
tags / email_tags本地标签
draftsemail_id, account_id, content, origin(ai/human), status(pending/approved/sent/discarded), created_at
ai_logstask_type, account_id, model, prompt_tokens, completion_tokens, est_cost, summary
notificationstype, title, body, ref_id, is_read, created_at —— 应用内通知中心
digest_historydate, content_json, is_read
settingsKV:轮询间隔、摘要时间、AI 端点/模型、主题
sync_stateaccount_id, folder, last_uid, uidvalidity

6. AI 流水线

新邮件到达(轮询拉回)
   │
   ├─ 1. 白名单?→ 直接进收件箱 + 立即通知(0 成本,不等 AI)
   ├─ 2. 黑名单?→ 直接归档(0 成本)
   │
   ├─ 3. AI 分类(批量约 20 封/请求,正文截断,输出 JSON:
   │      category + importance + needs_reply + reason)
   │      未配置 AI → 全部进收件箱(诚实降级)
   │
   ├─ 4. 营销/订阅 → 本地归档视图(按账号开关)→ 记入"AI 已处理"
   │
   ├─ 5. needs_reply 且账号权限 ≥ 草稿档 → 生成回复草稿(线程上下文 + Tone DNA)
   │      → 待审草稿 + 通知
   │
   └─ 6. 通知中心 + 浏览器通知:「新邮件 N 封,M 份草稿待审」

成本量级:批量 20 封/请求 + 截断 500 字符 → 日收 50 封 ≈ 3 次请求 ≈ 1–2 万 token/天。便宜模型(gpt-4o-mini / deepseek-chat)每天不到 1 分钱;Ollama 本地 = 0。

7. 轮询原理说明(为什么不会丢邮件)

  1. 邮件永远先送到服务商服务器(QQ/Gmail 的服务器是别人来信的落点,与 Nmail 是否在线无关)。
  2. Nmail 每隔 N 分钟用 IMAP 问服务器:“上次同步到的 UID 是 X,之后有新的吗?“(UID 是服务器给每封邮件的永久递增编号)。
  3. 有新邮件 → 拉回存入本地 SQLite,记录新 UID;下次从新 UID 继续。
  4. UID 只增不减,配合 UIDVALIDITY 校验(服务器文件夹重置时自动全量重同步),不漏。

结论:不会收不到,只会晚到。 最坏延迟 = 一个轮询间隔(默认 5 分钟);Nmail 关机一天,邮件在服务器上等着,打开即全量补同步。选轮询而非 IMAP IDLE 的原因:IDLE 是长连接”推”通知,各服务商实现差异大、连接易静默断开(看似在线实际收不到);轮询每次新建连接,状态干净。Gmail 有真正推送 API(Pub/Sub)但需 OAuth+云配置,远期。

8. 路线图(状态见 ✅/🚧/⬜)

阶段内容状态
P0 骨架仓库、MIT、run.py、FastAPI+React、DB 迁移、AI 端点设置✅ 完成
P1 邮箱核心 MVP账号、轮询收信、三栏 UI、安全读信、搜索、收发、管理、聚合、健康检查✅ 完成(真实账号验证)
P2 AI 层AI 批量分类、白/黑名单、自动归档、草稿+审核流、AI 面板、写作辅助、用量✅ 完成(真实数据验证)
P3 摘要与权限每日摘要+可视化、浏览器通知、账号权限、Tone DNA✅ 完成
P4 打磨分屏+拖拽、字号系统、总管家+会话持久化、AI 配置档案(多模型/多 Key)、服务商自动探测、打包分发(wheel/单文件 CI)、应用内更新检查+winget/Homebrew 渠道、AI 拟稿按钮🚧 进行中(总管家会话/配置档案/探测/打包已落地;余:设置保存 UX 修复、自然语言规则、定时发送/撤回、i18n)
远期PII 脱敏、主密码加密、MCP 接口、AI 强化路线(§11)⬜ 未开始(自动助理已由 v0.4 的 P6+Agent 化落地;Gmail/Outlook OAuth2 已于 2026-09-11 以用户自建 OAuth 客户端方式落地;MCP 以 P7 对外 API 为基座)
v0.4 改版P1 导航骨架(砍侧栏)+字号统一 · P2 资源管理器(文件夹树/拖拽/按需同步)+每账号服务器归档 · P3 草稿体系合并 · P4 通讯录 · P5 OAuth 内置凭证快速授权 · P6 AI 总管家 2.0(工具+审批/自动) · P7 对外 API · P8 官网✅ 完成并随 v0.3.0 发布
v0.4.x Agent 化原生 function calling+降级探测 · 可恢复长链(时间预算/步数/审批续跑/继续与停止) · 工具集对齐人人能力(26 工具) · Claude 式过程展示 · 用户提问与会话分段持久化✅ 完成(REDESIGN_PLAN §17,2026-09-14)
v0.4.x 对外 API Skill 化P1 API 补全(搜索过滤/回复转发草稿/正文三选一/草稿附件/watch 游标/错误 envelope+Retry-After) · P2 nmail-cli(uvx 分发/exit code 契约/CLI 两阶段确认) · P3 SKILL.md 分发(skills/ + npx skills add)✅ 全部完成(REDESIGN_PLAN §19,2026-09-15:P1-P3+收尾——skill 本机安装实测、官网 /docs/agent/、release CI 接入 CLI 发包);余:PyPI 实际发布随下一次发版触发

9. 参考项目(只借思想,不搬受限代码)

项目许可证技术栈借鉴什么
mailmindMIT ✅Python 3.12 + FastAPI + Next.js + LangGraph(云端重架构,核心纯 Python)代码级参考:AI 先行分类(few-shot+JSON,~170 行)、五轴可解释评分、Tone DNA(tone_dna.py)、PII 脱敏(pii.py)、优先级人工反馈循环
MiNiMailApache-2.0 ✅Electron + TS(桌面路线,与我们不同)产品形态参考:本地优先缓存、远程图片默认拦截、HTML 清洗、定时发送、5 秒撤回、快捷短语/模板、账号自动配置体验
inbox-zeroAGPL-3.0 ⚠️Next.js + Postgres + Redis + OAuth(重型自托管)只能借思想,严禁抄代码(AGPL 传染 MIT):自然语言 AI 规则、Reply Zero 双清单(待回复/待跟进)、批量退订、冷邮件拦截
mail-skill无 LICENSE ⚠️Python CLI Agent skill架构参考:服务商预设数据(事实性配置)、UID 同步/断线重连模式、FTS5 方案。不复制代码

10. 已拍板决策(首轮反馈确认)

  1. 自动归档 = 本地归档视图:Nmail 在本地数据库打”已归档”标记,聚合收件箱隐藏这些邮件;服务器上邮件原地不动(网页版登录仍可见);“已归档”页面随时查看/搜索/撤销。可选升级为同步服务器归档文件夹。(v0.4 修订:已改为每账号服务器端 Archived 文件夹真实移动,本地视图废除,见 REDESIGN_PLAN §4.6)
  2. 自动助理(agent mail)保留,排远期 P4+;权限模型现在按三档设计到位。(v0.4 修订:提前至 P6,仅 AI 专属邮箱默认自动)
  3. 草稿语言跟随来信。
  4. Python 后端确认(mailmind 为同栈先例)。
  5. AI 分类先行,规则引擎移除,仅保留发件人白/黑名单。

11. AI 强化路线(2026-09-14,随 v0.4.x Agent 化定稿)

北极星不变:人在 Nmail 能做的,AI 都能做;做得比人更省心。Agent 化(§17)补齐了”能做”, 本节是”更省心”的路线。按 工程完善 → 能力增强 → 远期探索 分层,均遵守既有安全边界 (授权位/审批/限额/审计/注入防护)。

11.1 工程完善(小而确定,可随时做)

项说明触发条件
并行工具调用模型一次返回多个工具调用时并行执行+前端逐步渲染(现顺序执行,结果等价)出现真实多工具场景收益时
agent_runs 自动清理✅ 已落地(REDESIGN_PLAN §18.2/§18.3:终态 30 天随启动清理,waiting/paused 保留,running 僵尸对账)已完成 2026-09-15
超长任务 LLM 压缩✅ 已由 §17.8 L5 AutoCompact 落地(token 水位触发,非步数条件)已完成 2026-09-14
步数/预算可配置180s/25 步进设置页用户反馈需要

11.2 能力增强(中期方向)

  1. 跨会话记忆 ✅ 已落地(2026-09-15,REDESIGN_PLAN §18.5):记住用户偏好与常用操作(“我的归档习惯""给谁发信要正式”),借鉴 inbox-zero 的 ChatMemory 思路——只从用户本人消息提取、每条须附用户原话佐证,防止从邮件内容脑补;存本机, 可查看可清除。
  2. Tone DNA 落地(§3.2 既有远期项):从已发送邮件学习用词/正式度/署名习惯,注入总管家起草提示词, 让 AI 草稿像你写的。
  3. 语义检索:FTS5 之上加本地向量检索(本地 embedding 模型),支撑”当时老张提过的那个预算数大概是多少” 这类模糊回溯;检索结果作为 agent 工具暴露。
  4. 附件理解:PDF/Office/图片正文解析进对话(“这封邮件附件里的发票总额多少”),作为读类工具; 与”AI 无文件来源、起草不带附件”边界不冲突(只读)。
  5. 自动化规则学习 ✅ 已落地(2026-09-15,REDESIGN_PLAN §18.5):用户手动整理时 AI 观察并提议规则(“以后这类邮件自动归档?”),批准后由 既有管线执行——自动规则与 agent 循环分离的架构已就位(借鉴 inbox-zero learned patterns,只借思想)。
  6. 主动式助手 ✅ 已落地(2026-09-15,REDESIGN_PLAN §18.6):定时指令(“每天 8 点总结未读并拟好需要回复的草稿”)——scheduler 触发 agent 运行, 产出进通知中心;与每日摘要调度骨架结合(开关替代当日摘要);无人值守场景以工具白名单硬边界替代逐项审批,草稿一律进待审列表。

11.3 远期探索

  • 计划模式:复杂任务先产出完整执行计划(列步骤+影响面)供用户确认,再逐项执行(现已是”边做边汇报”, 计划模式适合高危批量场景)。
  • 主题线推理:thread 级汇总与跨邮件追问(“这整个线程里对方承诺过什么”)。
  • 模型分级路由:简单任务(分类/摘要)走本地小模型、复杂任务走云端强模型,成本与隐私可按账号调配。
  • MCP 接口:把总管家能力以 MCP server 形式开放给外部 agent(以 P7 对外 API 与授权体系为基座)。

发现问题?直接到 主仓 docs/ 改这篇文档(本页随构建自动更新)。