- Console:React 19 + antd 6.6.5 前端(登录 admin/admin)+ Hono 管理 API (Nodes/Domains/Mailboxes/Emails/Webhooks/Keys/OAuth/Admin) - Node:Bun 转发节点(HMAC 签名、有限重试、心跳、结构化日志、优雅退出) - Email Worker:Cloudflare email handler + 本地联调入口 - shared:HMAC 协议(docs/04)、wmh_ Key(32 位)、AES-GCM 加密、SSRF 防护 - 邮件管线:postal-mime 解析、附件、catch-all、限额、malformed 降级、TTL 1 天 - Webhook:签名投递、指数退避重试、SSRF 校验、投递日志 - API v1 + MCP(JSON-RPC,六工具,凭据 kind 隔离) - Cloudflare OAuth:真实 + 本地 sim 模式,自动安装管线(幂等,无需手工命令) - 测试:bun test 41 例(协议安全/管线/TTL/Webhook/SSRF/MCP/OAuth/鉴权)+ Playwright UI 冒烟 - LOGO/favicon 由 codex CLI 生成
1.1 KiB
1.1 KiB
Email 生命周期与 TTL
接收
Cloudflare -> Email Worker -> Node -> Console
Console 验证 Node 身份和请求完整性,然后解析 MIME、提取 header、text/html 和附件,保存元数据,raw MIME/大附件写入 R2,计算 expires_at,并创建 Webhook Delivery。
TTL
默认保留 1 天:
received_at = 2026-09-30T10:00:00Z
expires_at = 2026-10-01T10:00:00Z
Retention 可按 Mailbox 配置。
Cron
使用 Cloudflare Cron Trigger,建议每 15 分钟执行一次清理。实际频率根据当前 Cloudflare 限制调整。
Cron -> 查询 expires_at <= now -> 删除 R2 -> 删除附件 -> 删除 Email
删除必须幂等。
Webhook
邮件保存成功后再执行 Webhook。Webhook 失败不能导致邮件重新进入 Node。
异常
R2 删除失败时保留数据库记录并记录 cleanup error,下一次 Cron 重试。数据库已删除但 R2 删除失败时,需要 orphan cleanup。
数据最小化
邮件、附件、raw MIME、Webhook Delivery 和临时日志都应有生命周期,不做无限期保存。