这份文档适用于:域名已经在 Cloudflare 里,或者你希望先手动在 Cloudflare 完成 zone 接入,再让 KaisouMail 接管启用和后续使用。
和“在项目里直接绑定新域名”相比,这条链路不会由项目替你创建 zone,而是要求你先在 Cloudflare 里把域名接入好,再回到 /domains 启用。
API Worker 运行时必须启用:
EMAIL_ROUTING_MANAGEMENT_ENABLED=trueCLOUDFLARE_RUNTIME_API_TOKEN(或共享的 CLOUDFLARE_API_TOKEN)EMAIL_WORKER_NAME如果这些运行时变量不完整,项目虽然可能还能启动,但 /domains 不会具备完整的 Cloudflare 域名管理能力。
这套运行时变量同时覆盖域名级 Catch All 开关;开启 Catch All 不需要再新增 额外 secret。
建议直接按 Cloudflare Token 权限 的 runtime token 最小权限配置。
对“手动在 Cloudflare 里先接入 zone,再回到项目启用”这条路径,至少要保证运行时 token 能:
如果你未来还要在项目里直接绑定新域名或删除项目直绑域名,就继续保留同一份完整 runtime 权限集合,不要再拆出第二套权限。
部署完成后,先确认:
GET /api/meta 里的 cloudflareDomainLifecycleEnabled=true/domains 页面能看到 Cloudflare 域名目录这一步只验证“项目能管理现有 zone”;它不要求 cloudflareDomainBindingEnabled=true,因为这个布尔值只影响“项目内直接创建新 zone”的入口。
example.com。active。如果你跳过 nameserver 委派,KaisouMail 之后虽然可能能看到这个 zone,但启用 Email Routing 时通常会停在 provisioning_error。
/domains。GET /api/domains/catalog 发现你刚刚接入的 zone。domains 记录,并尝试在该 zone 上启用 Email Routing。active 状态。如果 zone 仍在 Cloudflare 侧 pending,项目会保留本地记录,但状态通常会变成 provisioning_error。等 zone 激活后,再回到 /domains 点击“重试接入”即可。
域名变成 active 后,KaisouMail 会这样使用它:
POST /api/mailboxes:如果不指定 rootDomain,服务端会从 active 域里随机选一个POST /api/mailboxes/ensure:分段创建时同样可以省略 rootDomainGET /api/meta:只会返回当前 active 域名,不会返回还没启用的 Cloudflare catalog 项你也可以在 Web 控制台的新建邮箱表单里直接选中这个域名;只要它仍是 active,后续新邮箱就可以继续落到这个根域名下。
如果管理员又在 /domains 里打开了 Catch All,那么这个域上的未预注册地址也会开始收信,并在项目里显示为 Catch All 长期邮箱。
/domains 看不到优先检查:
EMAIL_ROUTING_MANAGEMENT_ENABLED 是否为 trueGET /api/meta 是否已经返回 cloudflareDomainLifecycleEnabled=true如果 catalog 仍然为空,先回到 Cloudflare Token 权限 和 部署与环境变量 重新核对运行时配置。
/domains 里能看到 zone,但点击启用失败最常见的原因是:token 只有读取能力,没有启用 Email Routing 的写权限。
优先检查:
Zone: Zone: ReadZone: Email Routing Rules: EditZone: Zone Settings: Edit如果错误是 Authentication error 或 forbidden,通常就是这里缺权限。
provisioning_error这通常不是项目没写入,而是 Cloudflare 侧 zone 还不能完成接入:
pendingactive/domains 点“重试接入”这表示项目已经有这个根域名的本地记录:
activeprovisioning_error先在域名目录里查这条记录,再决定是继续启用、重试接入,还是处理旧记录,而不是再次新建一遍。