Files
cloudflare_temp_email/vitepress-docs/docs/zh/guide/common-issues.md
jiaxin ebeb94ed23 fix: auto initialize default send balance (#985)
* fix: auto initialize default send balance

* fix: tighten send access auto init flow

* refactor: centralize send balance state

* fix: separate legacy repair from admin control in send balance

Add an `address_sender.source` column to distinguish legacy / auto /
user / admin rows. `ensureDefaultSendBalance` now only repairs rows
with `source IS NULL`, so admin-disabled and user-requested rows are
never overwritten. Admin POST writes tag `source = 'admin'`; new
auto-init inserts tag `'auto'`; `requestSendMailAccess` inserts tag
`'user'`.

Bumps DB_VERSION to v0.0.8 with the usual `PRAGMA table_info` guarded
ALTER, plus a standalone SQL patch under db/.

Adds E2E regressions: legacy repair path, admin-disabled rows stay
disabled across settings and send, send after admin deletion
auto-initializes a fresh row.

* fix: drop runtime legacy repair; backfill source='legacy' on migrate

Pre-v0.0.8 schema cannot distinguish legacy request-send-access
remnants from admin-disabled rows — both share `balance = 0,
enabled = 0`. Letting ensureDefaultSendBalance repair that shape on
upgrade could silently re-enable an admin-disabled row.

Remove the runtime repair path entirely:

- `ensureDefaultSendBalance` now uses `ON CONFLICT(address) DO NOTHING`;
  existing rows are never touched.
- The v0.0.8 migration (and the matching SQL patch) backfills every
  pre-existing row with `source = 'legacy'`, making pre-migration
  state explicitly off-limits to runtime auto-init.
- E2E: flip the legacy test to the negative direction — a
  `source='legacy'` zero-balance row stays untouched by settings
  reads and send attempts. Harden `resetSenderToLegacy` to return
  404 when `meta.changes < 1`.
- Update changelog and docs: legacy/admin-disabled rows must be
  restored manually via the admin UI.

* refactor: collapse send balance auto-init to missing-row insert

Per review feedback: the runtime guarantee we actually need is
"create an address_sender row when one is missing, leave existing
rows alone". Once `ensureDefaultSendBalance` switched to
`ON CONFLICT DO NOTHING`, the `source` column, the v0.0.8 migration,
and the `resetSenderToLegacy` test endpoint became dead weight —
the DO NOTHING path already protects admin-disabled and admin-edited
rows without any provenance metadata.

- Drop `address_sender.source` and the v0.0.8 migration; revert
  DB_VERSION to v0.0.7. No schema change ships with this PR.
- Strip the `source` field from `ensureDefaultSendBalance`,
  `requestSendMailAccess`, and the admin-update path.
- Remove the `/admin/test/reset_sender_to_legacy` test endpoint and
  its E2E helper; the negative legacy-repair test it served is no
  longer needed because the runtime no longer touches existing rows.
- E2E coverage stays focused on the three guardrails: missing-row
  auto-init, admin-disabled rows stay disabled, admin deletion
  triggers a fresh re-insert.
- Tighten changelog and docs to "auto-initialize missing rows".

* docs: align common-issues with missing-row-only auto-init

The FAQ entries for "DEFAULT_SEND_BALANCE set but still No balance"
still described the old behaviour of repairing legacy
`balance = 0 && enabled = 0` rows. Rewrite both zh and en rows to
match the current runtime: only addresses with no existing
`address_sender` row get auto-initialised; legacy, admin-disabled,
and admin-edited rows must be restored manually through the admin
console.
2026-04-20 12:40:14 +08:00

6.0 KiB
Raw Blame History

常见问题 (FAQ)

[!NOTE] 注意 如果你的问题没有在这里找到解决方案,请到 Github Issues 中搜索或者提问, 或者到 Telegram 群组中提问。

通用

问题 解决方案
使用 Cloudflare Workers 给已认证的转发邮箱发送邮件 使用 cf 的 API 进行发送,只支持绑定到 CF 上的收件地址,即 CF EMAIL 转发目的地址
绑定多个域名 每个域名都需要设置 email 转发到 worker
子域名收不到邮件 子域名需要在 CF 上单独启用 Email Routing 并配置 DNS 与 Catch-all 规则,仅在一级域开启不会自动覆盖子域,详见 Email Routing

Worker 相关

问题 解决方案
Uncaught Error: No such module "path". imported from "worker.js" 参考
No such module "node:stream". imported from "worker.js" 参考
二级域名无法发送邮件 参考
Failed to send verify code: No balance admin 后台设置无限制邮件或者发件权限页面增加额度
Github OAuth无法获取到邮箱 400 Failed to get user email 需要 github 用户设置公开邮箱
页面初始化时报 Cannot read properties of undefined (reading 'map') 先看 /open_api/settings 返回是否正常。如果是 Worker 直连部署,通常是 worker 变量没有设置成功,请检查 DOMAINSADMIN_PASSWORDS 等 JSON 格式变量是否正确配置;如果是 Pages 前端部署并且请求打到了错误地址,则继续看下方 Pages 相关排障

Pages 相关

问题 解决方案
network error 使用无痕模式或者清空浏览器缓存DNS 缓存
Pages 部署后页面报 map 错误,或 /admin/users/admin/new_address 等接口返回 405 Method Not Allowed 通常是前端后端地址配置错误。请检查 VITE_API_BASE、UI 页面生成 zip 时填写的地址或 FRONTEND_ENV:前后端分离直连 Worker 时,应填写后端 Worker API 根地址,并且以 https:// 开头、末尾不要带 /;如果使用 PAGE_TOML 通过 Page Functions 反代后端,则可保持 VITE_API_BASE 为空走同域请求。详见 Pages 前端部署
刷新页面或直接访问 /admin/user 返回 404 本项目是单页应用SPA通过 UI 部署 Pages 时需要在高级选项中将「未找到处理」设置为 Single-page application (SPA)。详见 Pages 前端部署

发送邮件相关

问题 解决方案
设置了 DEFAULT_SEND_BALANCE 但仍提示 No balance 先刷新前端设置页或重试发送。当 DEFAULT_SEND_BALANCE > 0 时,系统只会为尚无 address_sender 记录的地址自动初始化默认额度;已有记录(包括历史 balance = 0 且 enabled = 0 的行、管理员禁用或手动设置的行)不会被 runtime 修改,需要管理员在后台手动启用并设置余额。也可以将地址加入「无限制发送地址列表」或配置 NO_LIMIT_SEND_ROLE
提示 请先为此域名启用 resend 或 smtp 需要先配置 RESEND_TOKENSMTP_CONFIG,详见 配置发送邮件
SMTP_CONFIG 配置了但发送失败 请确认 JSON 中的 key 是你自己的发信域名(如 your-domain.com),不要直接复制示例 key。详见 配置发送邮件

邮件客户端相关

问题 解决方案
设置了 ENABLE_ADDRESS_PASSWORD 但 Foxmail/Outlook 等客户端无法登录 ENABLE_ADDRESS_PASSWORD 只是开启「地址密码登录」Web 接口,不等于提供标准 IMAP/SMTP 服务。要使用邮件客户端收发邮件,需要额外部署 SMTP/IMAP 代理服务

Telegram Bot

问题 解决方案
Telgram Bot获取邮件失败400Bad Request:BUTTON_URL_INVALID tg mini app 的 URL 填写错误,需要填写 pages 的 URL
Telegram bot bind error: bind adress count reach the limit 需要设置 worker 变量 TG_MAX_ADDRESS

Github Actions

问题 解决方案
Github Action部署后cf里始终是preview分支 到 cf pages 页面的设置中确认 前端的分支 和 Github Action 的 前端部署分支 是否相同