这份文档适用于:你希望直接在 KaisouMail 的 /domains 页面输入 apex 根域名,由项目代表你去 Cloudflare 创建 full zone,并继续完成接入。
这是我们当前正在使用的方案。它和“先在 Cloudflare 里手动绑定,再回到项目启用”相比,少了一次手工切换,但要求运行时权限和配置更完整。
API Worker 运行时必须启用:
EMAIL_ROUTING_MANAGEMENT_ENABLED=trueCLOUDFLARE_RUNTIME_API_TOKEN(或共享的 CLOUDFLARE_API_TOKEN)EMAIL_WORKER_NAME其中:
EMAIL_ROUTING_MANAGEMENT_ENABLED=true 决定项目能否读写 Cloudflare 域名与 Email RoutingEMAIL_WORKER_NAME 决定后续新邮箱 routing rule 指向哪个 Worker直接绑定比“只启用已有 zone”多一步 创建 zone,所以 runtime token 除了读取与启用 Email Routing,还必须能直接创建 zone。
推荐直接按 Cloudflare Token 权限 中 runtime token 最小权限表一次性配齐,并确保 scope 覆盖目标 Cloudflare account / zone。
CLOUDFLARE_ACCOUNT_ID除了 token 之外,项目直绑还要求 GitHub repository secret 中存在:
CLOUDFLARE_ACCOUNT_IDdeploy workflow 会把它注入 API Worker 运行时。少了这个值,项目即使有 token,也不知道应该在哪个 Cloudflare account 下创建 zone。
部署完成后,先确认:
GET /api/meta 返回 cloudflareDomainLifecycleEnabled=trueGET /api/meta 返回 cloudflareDomainBindingEnabled=true/domains 页面出现“绑定邮箱域名”表单如果第二项仍是 false,优先检查 CLOUDFLARE_ACCOUNT_ID 是否真的进入了 Worker 运行时,而不是只存在于 GitHub Actions job 环境里。
/domains 中填写 apex 根域名打开控制台 /domains,在“绑定新域名”卡片里输入根域名:

/api/domains/bind 只支持 apex如果你想得到 user@mail.customer.com 这类地址,不要把 mail.customer.com
直接提交给 /api/domains/bind。当前产品的推荐路径是:
customer.comsubdomain 设成 mailuser@mail.customer.com如果 Cloudflare 里已经存在某个 zone,可以改走
/domains catalog 启用;但当前产品不把
child-zone onboarding 当作标准免费接入路径。
点击 绑定到 Cloudflare 后,项目会调用 POST /api/domains/bind,并依次执行:
POST /zonesGET /zones/:zone_idPOST /zones/:zone_id/email/routing/enableactive,先去注册商修改 apex 的权威 NS提交后通常会出现两种结果:
active:表示当前域名的委派条件已经满足,可以继续用于新邮箱。provisioning_error / pending:表示 zone 已创建,但还没有完成激活,这时你必须先去域名注册商侧修改 nameserver。如果页面里出现 provisioning_error,会像下面这样保留这条记录:

这时点击该行操作列里的 详情图标,在弹窗里查看 zone 和 Cloudflare 分配的 nameserver:

然后把弹窗里的 nameserver 原样抄到你的域名注册商后台。
也就是说:项目负责创建 zone,但不负责替你去注册商改 NS。这个动作必须你自己完成。
/domains 重试接入把 NS 改好后:
pending 变成 active/domainsactive如果你没有先完成 apex 的权威 NS 切换,就反复点“重试接入”,通常不会成功。
域名进入 active 后:
POST /api/mailboxes / POST /api/mailboxes/ensure 可以显式传 rootDomainrootDomain,服务端会从所有 active 域名里随机选一个GET /api/meta 会把它放进当前可用根域名列表如果你在 /domains 里额外开启了该域名的 Catch All:
Catch All 长期邮箱如果你暂时不想继续给新邮箱分配这个域名,可以在 /domains 里停用;停用只会阻止新邮箱继续选中它,不会自动删除历史 routing rule。
建议排查顺序:先看权限与配置,再看 zone 状态,最后看 Email Routing 启用阶段的写权限。
com.cloudflare.api.account.zone.create 权限典型提示:
Requires permission "com.cloudflare.api.account.zone.create" to create zones for the selected account控制台里通常会看到类似下面的短提示:

这表示当前 runtime token 根本不能创建新的 Cloudflare zone,所以绑定流程会在第一步直接失败。
处理步骤:
/domains 重新发起绑定典型提示:
permission deniedforbiddenunauthorizedRequires permission ...如果不是明确的 zone.create,但仍然是权限类报错,通常说明当前 token 缺少绑定链路中的某个关键能力,例如:
处理步骤:
CLOUDFLARE_ACCOUNT_ID典型提示:
Cloudflare domain binding requires CLOUDFLARE_ACCOUNT_ID to be configured这不是 token 权限问题,而是运行时缺少 account id,导致 Worker 不知道应该在哪个 Cloudflare account 下创建 zone。
处理步骤:
CLOUDFLARE_ACCOUNT_IDGET /api/meta 确认 cloudflareDomainBindingEnabled=true/domains 重试pending 或 nameserver 尚未委派典型提示:
Zone is pending activationpending、activation、nameserver、delegated 的提示这说明 Cloudflare 已经接受了 apex zone 创建请求,但该域名还没有完成权威 NS 切换,所以 Email Routing 暂时无法启用。
在控制台里,这类域名通常会保留在列表中,并显示 provisioning_error,同时在操作列提供 详情图标 和“重试接入”:

这是项目直绑里最常见的“可恢复失败”:
provisioning_error/domains 点“重试接入”处理步骤:
pendingactive/domains 执行“重试接入”典型提示:
Email Routing management is enabled but EMAIL_WORKER_NAME is not configuredEmail Routing management is enabled but CLOUDFLARE_RUNTIME_API_TOKEN or CLOUDFLARE_API_TOKEN is not configured这不是 Cloudflare ACL 权限不够,而是 Worker 运行时缺少绑定链路需要的配置。
处理步骤:
CLOUDFLARE_RUNTIME_API_TOKEN 或 CLOUDFLARE_API_TOKENEMAIL_WORKER_NAME/domains 重试绑定典型提示:
Authentication error这通常表示当前 token:
处理步骤:
Zone: Zone: EditZone: Email Routing Rules: EditZone: Zone Settings: Edit如果提示不属于上面的任何一类,继续按这个顺序查:
CLOUDFLARE_ACCOUNT_ID、EMAIL_WORKER_NAME 都已配置