邮箱基础能力与接手说明
可直接交给 AI 阅读的开发流程、完整示例与验收边界。
本页目录
1.9.73 本机文件夹优先
取消“本机邮件汇总”导航。进入邮箱先读 MAIL_LOCAL_METADATA,再用当前 accountId、所选 folder 查询 MAIL_LOCAL_PAGE;首次默认收件箱。选择以插件账号和邮箱 ID 的哈希键保存在本机,重新打开恢复选择;已不存在的文件夹回退到收件箱/首个现有文件夹。此设置不上传云端。不发起自动远端收取或正文下载,手动收取和自动收取策略仍按原规则。清除此邮箱本机邮件不影响其他邮箱或服务商原件。
1.9.72 本机汇总命名补充
文件夹末尾入口简化为“本机邮件汇总”,title 说明仅汇总当前邮箱在这台电脑已保存的各文件夹记录,包括只有摘要、正文未下载的邮件。后台查询仍显式使用当前 accountId 与账号 scope,空 folder 只取消文件夹过滤,不取消邮箱隔离。
版本:插件 1.9.60/个人 MCP Worker 2.3.0/独立凭据云协议 1;2026-10-01。数据边界以 AGENTS.md 为准。
数据与网络路径
| 内容 | 路径或存储位置 |
|---|---|
| 邮箱配置、密码、OAuth、邮箱代理认证、脚本授权 | 用户自己的独立凭据 Worker 以 AES-GCM 加密存入本人 D1;本机加密缓存,官方旧副本仅迁移读取 |
| Outlook/Gmail 业务 | 浏览器直接访问 Microsoft Graph/Gmail HTTPS API 和 OAuth 端点,随浏览器 HTTP 代理;不经过个人 Worker |
| AOL/雅虎/163/QQ/自定义业务 | 浏览器 → 用户自己的 Worker /mail/request → TLS IMAP/SMTP;可用邮箱专用 HTTP CONNECT 代理 |
| 列表、正文、已读明细缓存 | 本机独立 IndexedDB sellerfeeds_mail_local_v1,按插件账号和邮箱 ID 隔离 |
| 附件 | 用户或已授权脚本明确下载时存入本机附件缓存,不向官方保存 |
新邮箱凭据不再由官方备份。独立凭据 Worker 保存连接配置密文;原个人 MCP Worker 仅实时转接 IMAP/SMTP,不保存邮件。官方不接收邮件业务查询、内容或附件,不用 R2 或独立服务器存邮件。全浏览器 HTTP 代理密码仍只存在本机;邮箱专用代理认证属于此次确认的邮箱凭据同步范围。
邮件缓存不进入四个中心的自动备份;脚本主动把邮件写入自己的报告时,依原有输出和用户网盘备份规则处理。删除连接保留本机缓存;换机从原个人 D1 恢复凭据,邮件需重新收取,或从用户明确创建的百度/WebDAV邮件备份合并恢复。
历史 1.9.51—1.9.59 的官方邮箱凭据描述仅作历史记录,当前存储规则以本节和文末 1.9.60 为准。
操作与 OAuth 前提
独立「邮箱」页面:先显示账号列表,进入账号先显示本机历史;列表右上角设置统一收取天数和自动收取。手动收取更新摘要,点开邮件按需下载正文,附件明确点击下载。“账号设置”在居中弹窗中添加/编辑邮箱,支持关闭按钮、Esc 和点击遮罩返回,弹窗内滚动。写邮件支持文字和最多 10 个附件,UI 原文件总量限制 8 MiB,核心完整 MIME 上限 12 MiB。HTML 转文字,不执行脚本或加载跟踪图片。
Outlook/Gmail 可手动填注册客户端和访问/刷新凭据,也可浏览器 PKCE 登录。回调由 chrome.identity.getRedirectURL('mail') 生成,需服务商注册匹配客户端/回调并开通权限;本项目没有代用户创建 Google 或 Microsoft 公共客户端。缺少有效注册、审核、权限时不能宣称开箱即用。身份测试核对邮箱,但不证明发信权限;实际发送须用户明确操作。
1.9.53 的 OAuth 诊断区分“刷新令牌”“登录授权兑换”“浏览器登录授权”失败,显示 HTTP 状态、白名单 OAuth 类别和数字 AADSTS 编号。微软描述只用于提取编号/白名单参数名,禁止回显原文、账号、Client ID、密钥或请求体。AADSTS9002326 表示浏览器跨域客户端限制;没有该编号时不能仅凭 invalid_request 作同样判断。微软 v2 刷新请求的 scope 是可选项,不能未取得实际错误便认定缺少 scope。未知错误保留安全编号供排查;失败不更换端点、不自动重试,不覆盖已存凭据。
用户报告同一凭据在心蓝桌面客户端可用,1.9.53 实测编号为 AADSTS90023(请求无效)。用户此次原始微软描述仍未知,不能确定具体根因。1.9.54 在 Outlook 刷新时发送 scope=https://graph.microsoft.com/.default,选择 Graph 已授权权限;不将 .default 与动态 Mail.Read 等权限混合,不改浏览器授权码兑换或 Gmail 格式。该修复针对未指定资源的兼容点,不保证导入令牌原本具备邮箱收发权限。
90023 的完整描述只在本机识别已知固定短语,输出安全原因:policy offers 且未指定 scope → scope_required;仅允许特定客户端跨域兑换 → cross_origin_restricted;SPA 令牌要求跨域来源 → origin_required;其余 → unclassified。这些分类只供管理页诊断,不控制自动重试、改变客户端类型或移除请求头,且不保留/显示原文和请求来源。仅凭编号仍不能判定具体原因。
诊断及 Graph 调用测试只使用虚拟凭据,不证明真实账号可收发;1.9.54 的用户回归已得到 cross_origin_restricted 安全分类;1.9.55 兼容模式见下一节。仍需用户重载后测试真实收发。
普通邮箱有主机/TLS 端口预设,用户按服务商要求启用 IMAP/SMTP 并取得应用密码/授权码。禁止 POP3、25 端口、明文认证、私人地址。SMTP 支持 TLS/STARTTLS,按能力选择 AUTH PLAIN/LOGIN。邮箱专用代理仅用于 Worker IMAP/SMTP,失败不直连。
发信不自动重试。SMTP 接受不等于最终投递,也不能保证进入“已发送”文件夹。DATA 提交后失联显示结果不确定,用户核对后再决定是否重发。
脚本接口与授权
// @sellerfeeds-mail {"read":true,"send":false}
// @sellerfeeds-notify {"mode":"all"}
// @sellerfeeds-data-center {"mode":"save"}
const accounts = await SellerFeeds.mail.listAccounts();
// 仅返回授权账号的 id/name/email/permissions,不返回密码或 Token。
const {folders} = await SellerFeeds.mail.listFolders({accountId:accounts[0].id});
const inbox = await SellerFeeds.mail.listMessages({
accountId:accounts[0].id,folder:folders[0].id,since:'2026-09-01T00:00:00Z',limit:20
});
const message = await SellerFeeds.mail.getMessage({accountId:accounts[0].id,messageId:inbox.messages[0].id});
listMessages 返回 messages、nextPage;下一页将 nextPage 原样传入 pageToken。文件夹用 listFolders 的真实 ID,不把各服务商写死为 INBOX。getMessage 返回文字正文和附件元数据,getAttachment({accountId,messageId,attachmentId}) 返回附件含 base64。IMAP 编号包含 UIDVALIDITY,变化后拒绝旧编号。
发送脚本声明 send:true,并在邮箱配置中另获发送授权:
await SellerFeeds.mail.send({
accountId,to:['receiver@example.com'],subject:'调研结果',text:'请查看附件。',
attachments:[{filename:'result.txt',contentType:'text/plain',base64:'b2s='}]
});
// accepted:true、deliveryConfirmed:false 表示提交接受,不代表收件人已收到。
仅活动 USER_SCRIPT/offscreen 可调用,MAIN world 禁用。后台核对真实任务、已启用脚本、声明与邮箱读取/发送授权,不信脚本自报身份。诊断仅管理页可用。Tool 参数只放邮箱 ID 和业务输入,不放密码、OAuth 或代理密钥;内容不得偷偷抄送官方或写日志。
代码入口与发布顺序
| 入口 | 职责 |
|---|---|
| core/mail-profiles.mjs | 账号同步、本机加密、预设、授权、轮换令牌 pendingSync |
| core/mail-oauth.mjs | HTTPS 白名单、PKCE、刷新与网站权限 |
| core/mail-client.mjs | Gmail/Graph API、MIME、Worker 转接、发送不重试 |
| core/mail-store.mjs | 账号隔离缓存,拒绝换账号后的迟到响应 |
| manager/views/mail.mjs | 收取、阅读、发送、配置与授权 |
| parser/task-runtime/offscreen-runtime/script-registry/sandbox | 声明与活动任务 API 桥 |
| worker/src/extension-credential-profiles.mjs | 官方 kind=mail 白名单和 D1 密文,不存业务字段 |
| cloudflare/sellerfeeds-personal-mcp/src/mail-gateway.mjs | Node TLS、IMAP/SMTP、CONNECT、有限帧/字节解析,无持久化 |
上线顺序:
- 官方 D1 已具备迁移 0029 后,执行 0030_mail_credential_profiles.sql,保留 AI/MCP 密文并扩展 kind。
- 发布支持 kind=mail 的官方账号 Worker;邮件业务路由不得放到官方 Worker。
- IMAP/SMTP 用户在实际绑定账号重部署个人 Worker 2.3.0;上传 index.mjs 和 mail-gateway.mjs,保留 AI/Durable Object,无 D1/R2 绑定。
- 重载插件、绑定邮箱、确认网站权限并验收,不得拿开发者 CLI 的另一账号代部署。
2026-09-30 已执行并登记官方 D1 迁移 0029/0030,并部署支持邮箱凭据和会话 CORS 头的官方账号 Worker。插件 1.9.52 本地打包,尚未发布到 GitHub/官网;用户个人 Worker 未代部署。线上接口发布不等于真实邮箱绑定、收发或换机恢复已经验收。账号服务 fetch/超时需显示明确网络原因且不得泄漏凭据、自动重发或假称保存成功。OAuth 轮换先本机加密保存,云端失败保留待重试版本,旧云端记录不得覆盖新令牌。
验证与未完成项
测试覆盖 D1 密文与业务字段剔除、当前设备限制、缓存隔离、MIME 中文/附件、读取与发送权限分离、令牌轮换失败、受限 HTTPS/OAuth 状态、IMAP 分片/UIDVALIDITY、SMTP 不重试和代理端点约束。
Cloudflare 本地运行器用 Node TLS 连接 imap.qq.com:993,成功读到欢迎行,未发送账号或认证信息;只证明底层 TLS 连接。UI 验证使用虚拟邮件,不代表真实收发。1.9.52 已在 Chrome 验证邮箱设置弹窗、Esc 和遮罩关闭,线上账号接口 OPTIONS 为 204 且允许会话头;匿名凭据请求返回带 CORS/no-store 的 401 JSON,未使用真实用户凭据。
仍需真实验收:各服务商授权码/收发、注册 Google/Microsoft 客户端和权限、浏览器代理、Worker CONNECT 代理及认证/STARTTLS、附件与发送结果、正式账号凭据换机恢复。模拟测试、本地打包、TLS 欢迎行均不能写成邮箱端到端成功。
Outlook 桌面客户端凭据模式(1.9.55)
用户将心蓝等桌面客户端的 Client ID/Refresh Token 手动导入时,可在邮箱账号弹窗将“Outlook 凭据模式”选为“桌面客户端凭据兼容”,点击“保存并同步”,再进入邮箱点击“收取邮件”。已有凭据留空保留,不必重填。默认 browser 保持原行为;浏览器 PKCE 登录成功会恢复 browser。模式变更须保存后才能应用于收发请求。
mail-token-transport.mjs 串行化 Outlook 令牌请求。desktop 仅作用于刷新令牌:临时 Chrome session rule 21801 限定插件发起的微软精确 token HTTPS 端点 POST/xmlhttprequest并移除 Origin。规则不匹配 query、其他路径、其他网页或 Gmail;授权码兑换强制 browser。每次操作先清除自己的旧规则,desktop 完成或失败后再清除;失败不重发。成功刷新先持久化轮换令牌,清理失败也保留新版本,下一次请求继续清理。规则设置失败不发送认证请求;不修改浏览器代理,不把请求转到服务端。
oauth.tokenMode 随已有邮箱连接凭据加密保存官方账号 Cloudflare D1。官方接口只增加 browser/desktop 白名单,旧记录默认为 browser;无 D1 表结构迁移、无个人 Worker 部署和 Cloudflare OAuth 更新。邮箱内容仍只在本机。
验收:25 项邮箱测试通过,独立 Chrome 151 的虚拟 HTTPS 端点实测头部限定、并发串行、失败清理、其他网页不受影响以及 CONNECT 代理路径。证据 output/playwright/outlook-transport-verification.json;没有真实邮箱凭据/微软请求。真实 Graph 收发与用户的实际代理必须另验,不能因为能移除 Origin 就宣称第三方客户端的所有令牌都可用。
2026-10-01 真实刷新对照,尚未恢复收信
用户授权使用其本机临时文件中的凭据做真实 HTTP 测试,并确认 Client ID 为公共客户端。测试均不发送 Client Secret,不经过官方 Worker;凭据不写入测试报告。Node 的 common v2/Graph .default、common v2/Mail.Read、consumers v2/Graph .default,以及微软旧 Live 桌面刷新格式均返回 HTTP 400/invalid_grant,固定诊断分类为 grant_expired;隔离 Chrome 使用实际 mail-token-transport.mjs 的 desktop 模式也返回 70000/同一分类,临时规则最终为零。旧 common v1 的 resource 请求返回 400/invalid_grant/40016。没有一次得到 Access Token,因此没有尝试读取邮件,不能宣称收信通过。
用户仍报告同一最新凭据在心蓝和手动 HTTP 请求中可用,但未提供成功请求格式。上述结果只说明已测试的请求被微软拒绝,不足以断定其他请求中这份凭据必然无效,也不能据此决定插件切换认证协议。Node 与隔离 Chrome 均未复现用户原 Chrome 插件代理或心蓝网络配置;系统代理检查未启用,不能扩大成 Chrome/心蓝也无代理。没有修改插件代码、打包或部署。脱敏结果为 output/playwright/outlook-real-refresh-verification.json;测试结束已清除本机临时文件中的凭据和隔离 Chrome 资料,不记录 Client ID、Token、微软原始描述或邮件内容。后续应以实际成功请求或相同网络路径为对照,不盲目增加失败重试。
Outlook 公共客户端简化与令牌轮换(1.9.56)
2026-10-01 使用用户更新后的凭据,通过独立 cURL 的 common v2 令牌端点请求,只带 client_id、refresh_token、grant_type=refresh_token,实际返回 HTTP 200 与 access_token/refresh_token;Graph 收件箱最小编号查询和 /me 身份查询均 HTTP 200。此证据确认这一组凭据与请求格式可用,不等于新版插件或真实发信已验收。凭据及邮箱身份不可写入仓库或示例。
Outlook 默认连接方式为 oauth.credentialKind=public-refresh:界面只要求 Client ID/Refresh Token,tokenMode 自动为 desktop,租户默认 common;刷新不带 scope、resource、Client Secret,不放开全局请求头过滤。旧记录默认 advanced,保留原租户、scope 与其他客户端方式;浏览器 PKCE 授权成功切回 advanced/browser,Gmail 沿用原格式。高级授权默认折叠。邮箱地址从 Graph /me 的 mail/userPrincipalName 识别;权限不足时允许用户补填邮箱地址,不从邮件收件人猜身份,不因地址识别失败丢失已轮换令牌。
可选 accountInfo 含 loginPassword、twoStepVerification、recoveryEmail,均与邮箱凭据一起加密保存在官方 Cloudflare D1;不回显到普通本机元数据,不交给脚本或 IMAP Worker,不用于自动网页登录或验证码生成。空白保留既有值,用户可显式清除整组;名称默认使用邮箱地址。服务端凭据白名单需部署后才能保存新选项,无需 D1 迁移或个人 Worker 更新。
令牌刷新成功后,先在本机凭据仓库替换 Refresh Token/Access Token,再同步账号。未完成身份确认的本机草稿标记 needsIdentity,不能执行邮箱业务或被云端列表删除;用户补填地址重试使用已存新令牌。同步失败保存 pendingSync,下一同步先提交新版本,再拉取云端;云端旧 GET 晚到也不能覆盖更新的本机记录。界面失败重试只在后台确认已保留令牌时清空旧 Token 输入,避免重提旧值;失败刷新未取得新令牌则保留输入。没有新 Refresh Token 的成功响应继续使用已存 Refresh Token。清理兼容规则失败也不丢失已轮换令牌。
入口:mail-oauth.mjs、mail-profiles.mjs、mail-token-transport.mjs、mail-client.mjs、manager/views/mail.mjs、worker/src/extension-credential-profiles.mjs。回归覆盖两字段添加、精确请求字段、地址识别、轮换/同步、识别失败重试、旧云端 GET 竞态与加密资料隔离。当前交付为本地 1.9.56;新版 Chrome 用户实际收信、发信和换机需分别验收,不能用纯 HTTP 或布局预览替代。
1.9.56 实际协议复核:独立 Chrome for Testing 加载当前 mail-oauth.mjs 及其依赖,使用公共客户端方式刷新真实用户凭据后,令牌刷新/Graph 最小编号查询均 HTTP 200;本机轮换保存确认,规则清理后为零。证据 output/playwright/outlook-chrome-1.9.56-verification.json 不含令牌或邮箱身份。该检查未登录官方账号,不能代替用户安装版的账号同步、实际发信或换机验收。相关回归 98 项、插件静态检查和官方 Worker 部署预检通过;官方后台发布仍等待本次线上操作确认。
邮箱页面层级(1.9.57)
第一层展示邮箱账号列表,每行右侧“配置”打开既有配置弹窗;列表顶部“添加邮箱”打开空白配置。点击邮箱行进入其收发工作区,顶部提供返回列表与当前邮箱配置,页内“收邮件/写邮件”Tab 在同一区域切换。自 1.9.59 起收取天数在列表的“邮箱设置”中统一设置,手动收取在收件页;文件夹、邮件列表、正文采用三栏,窄屏调整为纵向。进入邮箱本身不发网络请求,收取及发送须用户点击;写信失败不自动重发。Tab 切换保留草稿,返回列表有未发送内容时确认,发送提交时不允许切换邮箱。
标准目录显示中文:收件箱、已发送、草稿、垃圾邮件、已删除、归档等;映射模块只改变文本,不修改服务商目录 ID。Gmail 使用系统 Label ID,普通 IMAP/Outlook 精确匹配常见名称;自建名称保留。界面移除两个独立测试按钮,授权、保存、删除及脚本授权入口保留。真实读信、发信和跨机仍沿用前述验收边界;浏览器布局测试是模拟请求,不发送真实邮件。
添加邮箱的基础字段(1.9.58)
邮箱地址与名称始终显示在服务商选择之后,名称可选、留空用邮箱地址。AOL、雅虎、163、QQ及自定义 IMAP 的登录用户名为完整邮箱时可自动补全地址;非邮箱登录名须单独填写真实地址。Gmail 须填写地址,Outlook 可从授权自动识别。附加账号资料不参与这些必需字段。保存前进行本机校验,缺地址以 MAIL_EMAIL_REQUIRED 提示并聚焦字段,不提交空配置。旧失败待同步记录可补全或作为 needsIdentity 草稿保留,不阻塞其他邮箱,密码与轮换令牌保留;修复与令牌写入共用本机串行队列。无需后台迁移或 Worker 更新。
本机邮件与摘要自动收取(1.9.59)
- 统一设置在邮箱列表右上角。自动收取默认关闭,最近天数默认 30,可设置 1–3650;开启后每 10 分钟收摘要/状态,浏览器关闭时停止。只保存在当前账号的本机设置,换机仍默认关闭。
- 已连接邮箱从本机公开连接索引进入,先读本机文件夹/邮件;搜索和分页查询整个本机缓存。远端最近天数不限制已保存历史展示。首次未有本机连接时仍需联网恢复连接凭据。
- 收取摘要按消息 ID 合并,不抹去已经保存的正文和附件元数据。点击未下载正文或“下载选中正文”时才取正文;已保存内容无需再次远端获取。附件显示已保存/未下载,显式获取后本机缓存,再次点击仅导出缓存。
mail-store.mjsDB 版本 2 保留旧 messages,增加 metadata(文件夹、分页进度与收取结果)和 attachments。均按插件账号与连接 ID 隔离,不进入官方 D1/R2或四个中心备份。清除本机邮件先确认,清除时使旧请求写入失效;服务商邮件不受影响。连接删除保持缓存,当前界面没有失去连接后的独立归档入口。mail-client.mjs的collectMailSummaries为管理页收取;runAutomaticMailReceive遵守默认关闭策略,background.mjs的10分钟 alarm 在当前设备会话有效后运行。管理查询只接受插件管理页。脚本接口仍按原活动任务/逐邮箱权限核对,不能利用本机缓存绕过授权。- 大邮箱每文件夹每轮最多 10 页,每页最多 50 封,持久化下一页游标。未完成可手动或下一次自动继续;收取失败保留历史并显示原因。后续完整轮会复查窗口内摘要,不是 Graph delta/Gmail history/IMAP CONDSTORE,不保证同步远端全部移动/删除。缓存仅合并,不因远端窗口缩小、邮件消失或目录切换自动清掉历史。
- 现有 IMAP 正文接口读取完整 MIME,阅读正文可能同时传输邮件内附件字节;只保存正文和附件元数据,显式下载附件才进入附件缓存。摘要收取不下载 MIME 正文。无需个人 Worker 更新;本轮不改官方凭据接口或 D1。
验收:本机 IndexedDB 迁移、摘要保留正文、账号隔离、离线正文/附件复用、分页续取、默认关闭及失败保留历史使用模拟协议回归;相关 119 项测试及插件静态检查通过;Chrome 布局与交互用虚构邮箱验证(统一设置、进入只读本机、正文复用、选中下载与窄屏),不发送真实邮件。真实 AOL/Outlook 等安装版的收取、离线阅读及自动 alarm 仍需分别验收。
用户自有凭据云与手动邮件备份(1.9.60)
用户流程
- 重载原路径的插件,进入邮箱 → 凭据云 → 授权部署/恢复凭据云。
- Cloudflare 授权选自己的账号并允许 Workers 与可选 D1 读写,回插件选择该账号并部署。新 Cloudflare 账号需先在 Workers 页面设置 workers.dev 子域名。
- 点击“授权连接”,从用户手势申请新 Worker 网站权限并同步。已有本机旧凭据先写入空的新 D1;换机使用原 Cloudflare 账号和同一插件账号,复用原库和 Secret,恢复连接而非重新初始化空库。
- 旧官方凭据在高级“旧邮箱凭据迁移”中主动执行。每项写入/读回核对后删除对应官方副本;未核对或冲突的保留。
- 进入某个邮箱 → 邮件备份,可向本人百度/WebDAV创建备份、读取备份列表或合并恢复;不自动下载尚未收取正文/附件,不默认上传内容。
代码入口与协议
| 入口 | 职责 |
|---|---|
core/personal-data-deploy.mjs、core/cloudflare-deploy.mjs | 短期 OAuth PKCE,用户所选账号,部署后清理授权会话 |
cloudflare/sellerfeeds-personal-data/deployment-api.mjs | 复用 Worker/D1,保留加密 Secret,缺密钥且库非空时拒绝 |
cloudflare/sellerfeeds-personal-data/src/index.mjs、schema.sql | 用户 D1 凭据密文、revision CAS、删除 tombstone、账号作用域、JSON 白名单 |
core/personal-data-cloud.mjs | 本机加密连接、HTTPS Worker 根地址、网站权限、响应大小/超时与账号切换校验 |
core/mail-profiles.mjs | 同步、旧本机记录采用、令牌轮换与显式迁移;不再向官方 PUT mail |
worker/src/extension-credential-profiles.mjs | mail 新写410,普通读取410,migration=1读取旧记录及 SHA-256 密文哈希,哈希条件 DELETE |
core/mail-backup.mjs、core/mail-store.mjs | 64MiB、512KiB分片、读回校验、身份核对、完整验证后本机事务合并 |
core/baidu-direct.mjs、core/webdav-direct.mjs | 内容直达个人网盘;WebDAV目录用ETag条件更新,百度下载使用现有受限直连通道 |
manager/views/mail.mjs、manager/index.html | 凭据云/邮件备份两个共享弹窗,用户点击授权、迁移和备份 |
D1 /mail/credentials 只接受连接配置;Bearer+owner scope 校验,记录内容 AES-GCM(AAD含作用域及配置ID)。这不是端到端密码库:用户 Worker 持有解密密钥并只向授权本机返回凭据。官方不持有该 Secret 或连接Token。PUT {profile,baseRevision}、DELETE {id,baseRevision};GET返回revision和tombstone。旧revision、较旧更新时间、邮箱身份变更拒绝。冲突仅在本机版本更晚且远端未删除时读回revision重试一次;较新云版本不能静默覆盖,令牌留在本机待核对。
邮件备份为已缓存数据的普通网盘文件,不含密码或OAuth,SHA-256用于损坏校验,不是额外加密或防恶意篡改承诺。路径:百度 <应用备份根>/mail-backups/<scope16>/<备份ID>/,WebDAV sellerfeeds-mail-backups/<scope16>/<备份ID>/。成功的manifest最后写入,恢复逐片校验后才修改本机;损坏备份不会部分写入。较新的本机正文和已有附件保留。独立备份不影响四中心策略。
发布与验收边界
本轮无新的官方 D1 迁移,仅更新官方 Worker 的旧邮箱凭据只读/条件清理。个人 MCP 业务 Worker无需因凭据云改造而重部署;IMAP业务若仍旧于2.3.0须按原规则更新。独立凭据云由用户在实际账号授权部署;不能用开发者CLI账号代部署。公共 OAuth 客户端需配置可选 d1.read d1.write,首次连接须允许这些权限。
测试覆盖用户 D1 密文/权限/旧版本拒绝/删除标记、保留加密Secret的部署、空库采用本机凭据、较新令牌迁移、读回不一致保留旧副本、令牌竞态、本机备份合并及 WebDAV损坏分片拒绝。真实用户Cloudflare授权/部署、用户已安装新版端到端迁移、真实百度与WebDAV备份仍需分别验证;当前不能声称用户旧官方副本已清理。
2026-10-01 交付检查:147 项相关回归通过;插件静态检查为 159 个打包文件、74 个示例脚本;独立凭据 Worker 的 Wrangler 打包预检通过。Chrome 使用虚构邮箱和模拟接口核对凭据云授权→账号选择→部署→单独网站权限连接、邮件备份列表与合并恢复提示,未发送真实邮件或部署用户数据云。官方 alexa-hub 已部署,版本 a9944c2d-6148-4113-9b60-c7321bd78911;生产匿名凭据请求 HTTP 401,扩展预检 HTTP 204 且允许设备会话头。没有新的官方 D1 表结构迁移。公共 OAuth 客户端的 D1 Read/Write 已于 2026-10-01 经用户确认保存为可选权限,列表实际显示四项范围,Public/Verified 保持;实际用户账号部署、旧副本迁移和真实网盘仍未验收。
1.9.69 邮箱进入个人空间
邮箱组件从本机公开账号索引展示邮箱,以连接 ID 选择账户,图标/列表两种排列;配置仍使用原 mail-config 弹窗,收发复用 mail-workspace。没有第二份正文/附件缓存,也不把邮箱凭据放在布局里。旧独立邮箱菜单删除,旧 mail 路由回个人空间。进入界面不调用 MAIL_LIST 拉云端凭据;首次恢复和十分钟后台同步负责连接恢复。点击邮箱先显示本机摘要,手动收取、正文按需下载、发送及备份规则保持。未发送邮件离开前确认,提交中拒绝切换邮箱;组件上提供邮箱设置入口。
1.9.70 邮箱收发悬浮窗
个人空间邮箱账号点击在共享管理页弹窗收发;背景页面和当前标签保持,关闭原路返回。配置与备份是子窗口,关闭后恢复收发窗和草稿。关闭、Escape、遮罩均先检查未发送内容;发送提交中不可关闭。账号变化强制清理。此调整不增加自动收取、正文下载或云存储,所有原缓存和凭据 ID 保留。
1.9.71 邮箱工具栏
收发悬浮窗不重复显示账号头行,标题识别当前邮箱。配置在清除此邮箱本机邮件右侧,写邮件时仍可打开。folder ID 保持服务商原值,仅展示排序/翻译:收件箱、垃圾邮件优先,Conversation History 译为对话历史记录(Outlook 可用于旧即时通讯对话存档,不是插件 AI 聊天)。空 folder 是当前 accountId 的全部本机邮件,清除仍严格 accountId,不清其他邮箱或远端原件。
