更新摘要
- 邮箱加密配置支持一份全局密钥;旧独立密钥继续兼容,主管理员可通过首页向导主动迁移。
- 减少邮件列表、数量统计、外部邮箱同步及通知的数据库读写,额度耗尽时提供明确提示和退避。
- 修复 D1 数据库名称与部署定位不一致的问题,已有用户按实际绑定 ID 升级,首次自动建库统一命名。
新增
- 新增可选 Secret
MAIL_CREDENTIALS_KEY,供七种外部邮箱统一加密凭据,内部按服务派生密钥。 - 主管理员首次打开首页可查看升级说明,再进入配置与迁移向导;显示实际迁移进度,支持暂停、 关闭后继续和失败重试。历史凭据只在主管理员主动开始后迁移,不接入后台定时迁移。
- 新增桌面账号导入目录及所选凭据导入接口,仅支持设备令牌;导出前重新验证当前用户密码和 已启用的 MFA,限制账号归属与数量。Windows 桌面客户端尚未交付,本次仅包含服务端接口和规划。
- 邮件详情新增
replyTo字段,优先使用有效的 Reply-To 地址,否则回退发件人地址。
改进
- 按实际收件地址建立复合索引,数量统计按用户、权限、邮箱范围与版本短时复用;并发写入时 在同一数据库批次重新读取列表、统计和版本。
- 相同邮件状态不再重复写入和递增版本;邮箱归属及可见性变化会使缓存失效。
- 外部邮箱同步只在元数据或状态变化时更新索引;索引裁剪跟随新增、重建、上限变化及低频核查。
- 搜索索引历史补全保存扫描进度,每轮有界处理,完成后每天核查;新邮件继续在解析时建立索引。
- 通知按来源限制最新候选,单独计算准确未读数,并在版本未变时复用结果,避免返回条数截断总数。
- D1 免费日读写额度耗尽时返回明确
503、恢复时间和Retry-After;网页请求退避,队列延迟 重试,定时任务结束本轮后续查询。数据库异常不再被一律误判为缺少迁移表。 - 优化外链确认弹窗的滚动条样式。
修复
- 修复 #12
所述的 D1 库名不一致场景: 部署前读取目标 Worker 的实际
DB绑定,迁移和发布使用同一个数据库 ID。 - 已有数据库保留原名;首次自动创建统一命名为
omni-mail-db。绑定缺失、ID 冲突、权限错误或 首次部署发现未确认的同名库时停止,避免擅自切库、复用错库或新建替代库。 - 迁移状态响应异常时跳过可选引导或显示读取失败,不影响主邮箱页面正常使用。
- 密钥迁移弹窗使用不透明背景,正文独立滚动;七种邮箱同时迁移时,窄屏和矮窗口的底部操作按钮完整可见。
- 连接失败页面明确展示 D1 每日额度耗尽的中文原因和本地预计恢复时间,兼容旧后端透传的英文 读写限额错误;普通连接错误保持原有重试流程,额度退避不会跨过每日恢复时间。
升级说明
- 备份数据库和现有 Secret,更新自己的 Fork,然后通过
npm run deploy发布。部署会先应用0036_message_read_optimization.sql、0037_mail_notification_versions.sql;首次索引创建会产生 数据库读写,应确保额度可用。重新部署不会重置已耗尽的免费日额度。 - 全局密钥为可选项。不添加它也能继续使用原来的独立密钥,用户无需重新绑定邮箱。
如需切换,在 Cloudflare 配置至少 32 个随机 UTF-8 字节的
MAIL_CREDENTIALS_KEY,保存部署后 回到首页向导检查配置并主动迁移。 - 迁移完成前保留旧密钥。完成后也要保留历史备份对应的旧密钥副本;不要随意更换或删除 正在使用的全局密钥。开始写入新密文后,不能直接回滚到无法读取新格式的旧版本。
- Worker 默认名称仍为
omni-mail,D1 绑定名仍为DB。旧库无需改名;构建凭据需要能读取 Worker 绑定并编辑目标 D1。已有推荐的 Deploy commandnpm run deploy无需修改。 - 本次只发布 Web
1.1.0。Float、Android 版本号和商店发布保持独立,已有兼容客户端仍可连接。
测试
- 发布检查包含单元测试、Worker/D1 集成测试、类型检查、Lint、Web 构建、浏览器端到端测试和 Wrangler dry-run;同时验证本地 D1 连续迁移及扩展兼容流程。
- 本地同一份 1,282 封模拟邮件中,列表与统计批次读取行数从 2,252 降至 224,约减少 90%; 这是该样本结果,不代表所有线上负载的固定降幅。
- 覆盖旧密文兼容、七种邮箱凭据迁移、并发更新、准确未读总数、账号归属与删除、额度退避、 队列延迟重试、主管理员引导及暂停恢复。
- 已在现有 Cloudflare 实例验证原绑定保留、首页与配置接口可用、定时任务及队列正常执行。
发布
- Web 版本为
1.1.0,通过 GitHub Tagv1.1.0发布,不包含额外下载文件。