Agentic Inbox
自托管 AI 邮件客户端,跑在 Cloudflare Workers 上,处理我两个域名(lakebbs.ca + tensorproxies.com)的来信。Email Routing + Durable Objects + R2 + Workers AI + Agents SDK。
背景
我有两个域名要真实收邮件 —— lakebbs.ca(社区平台)和 tensorproxies.com(代理基础设施产品)。两边都需要接 support / contact 邮件,都希望有 AI 协助分流,免得每天花一小时清收件箱。
Agentic Inbox 是基于 Cloudflare 官方 agentic-inbox fork + 扩展的自托管邮件客户端,全部跑在 Cloudflare Workers 上,AI agent 读会话并起草回复。自己跑 而不是把邮件交给第三方服务。
架构
整个产品跑在 Cloudflare。没有外部 SMTP,没有第三方 AI 供应商,没有独立数据库。所有东西都终止在一个账号内:
Browser (React SPA + Agent panel)
│
▼
Hono Worker (API + SSR)
│
├──▶ MailboxDO ──── SQLite (per-mailbox) + R2 (附件)
│
└──▶ EmailAgent DO (AIChatAgent) ──── Workers AI 工具调用
├── 读 inbox
├── 搜会话
├── 起草回复
└── 发送(必须显式确认)
为什么这套栈跑得起来:
- Per-mailbox Durable Object 隔离 —— 每个地址(
hello@tensorproxies.com,contact@lakebbs.ca等)跑在自己独立的 DO 里,带自己的 SQLite 库。没有 noisy-neighbor 问题,也没有跨邮箱查询风险。 - Email Routing 收入口 —— 每个域配 catch-all 规则直接把邮件管到 Worker。Worker 解析收件人 → mailbox DO → 写到那个 DO 的 SQLite。入站延迟亚秒级。
- R2 存附件 —— 几 KB 以上的附件按 message ID 存 R2。SQLite 行只存引用,不存 blob。
- Agents SDK 跑助手 ——
AIChatAgent类带 9 个邮件工具(读 / 搜 / 起草 / 发送 …)。Agent 只 起草,发送必须我在 UI 里显式确认。自动 fire-and-forget 在这产品里被故意拒绝。
我扩展了哪些
官方 repo 已经很扎实,但默认假设单域名。我需要它跨我两个域多租户,加一些日常使用感更顺手的修改:
- 多域
DOMAINS配置 ——wrangler.jsonc设成lakebbs.ca,tensorproxies.com,两边的 catch-all 都路由进同一个 Worker - 邮件模板 —— 预填常见回复(TCF 咨询 / 代理套餐问题 / ModBox 媒体询问),让 agent 第一稿就接近我的语气
- 发件人 avatar —— 小 UI 改善;线程列表看起来不再是一堵主题文字墙
- 任务级 inline 撰写 —— 回复 / 转发在线程内联打开,不弹全屏 modal。一次清 20 封时就该这样
安全模型
整个 app 在 Cloudflare Access 后面。唯一信任边界就是 Access policy:通过 policy 的用户可以访问所有 mailbox(也包括 /mcp MCP server,让 Claude Code 之类的外部 AI 工具通过 mailboxId 参数操作任一 mailbox)。我是 policy 唯一成员,所以现在 OK;要对外开放会先做 per-mailbox 授权。
POLICY_AUD 和 TEAM_DOMAIN 是 Worker secrets,wrangler secret put 注入。每个请求都验 JWT。Worker 强制「生产必须配 Cloudflare Access」否则拒绝启动 —— 任何碰我邮件的东西都该这样 fail-loud。
技术栈与链接
前端: React 19 · React Router v7 · Tailwind · Zustand · TipTap · @cloudflare/kumo
后端: Hono · Cloudflare Workers · Durable Objects (SQLite) · R2 · Email Routing
AI: Cloudflare Agents SDK (AIChatAgent) · AI SDK v6 · Workers AI (@cf/moonshotai/kimi-k2.5) · react-markdown + remark-gfm
认证: Cloudflare Access JWT 验证(生产环境强制)
Upstream: github.com/cloudflare/agentic-inbox —— Apache 2.0