Smail/docs/生产整改验收清单.md
smail 48d813db5e
Some checks are pending
Security Checks / security (push) Waiting to run
补录Linux部署复审与证书维护故障修复
2026-10-06 06:18:02 +08:00

567 lines
73 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 生产整改验收清单
## Linux 统一部署与证书维护复审(2026 年 10 月 6 日 06:16)
- [✓] 三个 Linux 程序统一为 `review-733612b`,本地与部署摘要一致,主进程自动重启零。
- [✓] 三个指定角色已注销后重新密码登录;剩余页面残留核查详见《Linux上线复审记录》。
- [✓] 修复证书维护任务缺失环境文件、邮件端证书未同步问题;06:12 真实维护任务成功,Smail 未重启。
- [✓] 修复后五个邮件加密入口的域名、信任链及握手通过;本机公网 HTTPS 首页返回 200。
- [!] 本次无需续期,未发生真实 DNS 挑战或新证书换发;邮箱绑定、外部集成及原清单剩余门槛未关闭,整体不放行。
- [!] 旧归档收据不代表当前部署;新本地收据单独记录文件摘要及未完成状态。容量及未引用证书清理项详见复审记录。
以下保留历史证据,不覆盖本节当前运行状态。
## PostgreSQL 角色提升、降级与旧会话复审(2026 年 10 月 4 日 11:17)
- [✓] 超管页面将 `dbreview` 提升为管理员并保留甲、乙两组;经本人密码确认后保存,管理员重新登录后仅见所属两组,同级编辑按钮禁用。
- [✓] 提升前普通用户旧会话失效;管理员状态重新登录成功,用户管理范围未越组。
- [✓] 管理员降级为普通用户时保留两组被明确拒绝,提示普通用户只能属于一个分组;通过分组管理单选乙组后,经超管本人密码确认保存成功。
- [✓] 降级列表显示普通用户且仅属于乙组;旧管理员会话失效,重新登录后无用户管理、配置管理入口。附件下载保存沿用用户人工确认,不扩大为跨库附件验收。
- [!] 本节仍不代替后端越权、协议旧连接撤权、三库全功能、外部验证、恢复续期、最终清理及全新初始化;整体仍未放行。
## PostgreSQL 通知权限接续复审(2026 年 10 月 4 日 10:58)
- [x] 补录 MySQL 普通管理员为同组临时账号开启通知并保存 2/5 限额;本段迁移后通过管理员、普通用户各自刷新页面核对保持,不重复计入六向迁移。
- [✓] 超管重新登录后完成页面迁移至 PostgreSQL `smailperm20261004`;07:57:37 仅重启 Smail,主进程 `2023584`,自动重启零。实际运行连接使用 TLSv1.3,10:58 再核对一致;Nginx 保持 active。
- [✓] PostgreSQL 临时建库权限已撤销,账号非超级用户;确认原 MySQL 不再使用后撤销本轮精确库授权。前段误提前创建的 PostgreSQL 空库未使用、未删除,列入最终清理,不以预建空库绕过迁移流程。
- [✓] PostgreSQL 管理员刷新后仅见本人及同组账号,可验证本人密码生成同组用户凭据;普通用户验证本人密码后可查看、手动隐藏,无自行授权或重置入口。随后管理员关闭授权,普通用户刷新显示未开启且查看入口消失。
- [x] 错误密码未捕获明确反馈、完整 60 秒隐藏未观察,均不记通过;只观察到成功查看后的倒计时及手动隐藏。敏感明文不进入报告、Git,临时快照已覆盖。
- [!] 保留 PostgreSQL 分组降级与旧会话、三库其余功能、SMTP 协议与实际配额、外部安全邮箱、Telegram、完整恢复续期、历史测试遗留清理及最终全新初始化门槛。当前仍为连续验收现场,不是最终无旧数据部署,整体不放行。
## MySQL 分组与通知权限复审(2026 年 10 月 4 日 07:35)
- [x] 前段已通过网页切换 MySQL `smailaccept20261004`;本段只读核对当前运行库、主进程 `2022911`、自动重启零及 Smail、Nginx active。当前不是 SQLite,历史测试库和迁移备份仍待最终清理。
- [✓] 新管理员 `dbreview` 仅开启安全码、未绑定外部邮箱可正常密码登录;用户管理只显示甲乙两组,默认组及组外账号不出现。只证明页面操作范围,不扩大为后端越权测试。
- [✓] 多分组管理员降级时,未选择单组被明确拒绝;手动选择乙组并验证超管密码后保存,超管列表确认普通用户。旧管理员会话点击刷新列表返回登录页;重新登录为普通用户,没有用户管理、配置管理入口及旧管理弹窗残留。
- [✓] 超管为该账号单独开启通知、生成凭据;普通用户刷新后可查看本人授权状态,验证本人密码后进入凭据查看状态,无自行授权或重置入口。随后超管关闭授权,用户刷新显示未开启且查看入口消失,原网页登录仍有效。
- [x] 临时账号保留为乙组普通用户,安全码开启、外部邮箱未绑定、通知授权关闭;未改主要三账号配置,未删文件或清库。敏感凭据不进入报告及 Git。详细证据与限制见《云端全项目测试报告》同时间章节。
- [!] 本节不代替安全码恢复、错误密码及凭据超时、通知 SMTP 真发信及旧连接撤权、配额、三库全功能、外部验证、完整恢复续期及最终清理初始化;全项目仍未放行。
## 名称提示与登录资源恢复复审(2026 年 10 月 4 日 06:55)
- [✓] 云端新版 `2aa7e7f` 的新建账号、编辑账号和本人资料三个入口,十一字显示名称均明确提示“显示名称须为 1–10 个字符,且不能包含控制字符”。超管保存十字名称后,普通用户本人资料页实际读到;普通用户恢复原名后,超管刷新确认正常。未修改角色、分组及凭据。
- [✓] 已实际复现登录动态模块 404:管理员新版只读列表保留在浏览器,受控切换旧主程序后导航至登录页,网络请求 `742/743/745` 返回 404、控制台消息 `20` 报动态导入失败,随后文档请求 `749` 自动重载并显示登录表单,保留编码后的 `/list` 返回路径。不是只依据源码或构建通过;首次普通用户注销整页刷新未触发此错误,不计入该通过证据。
- [x] 本次未重新触发禁用或 401,不扩大为全部会话失效组合、重复限次、离线及编辑保护通过;管理员没有注销,保留中的草稿标签页未操作。表情、控制字符及后端独立拒绝路径仍保留实机验收边界。
- [✓] 06:52:59 恢复 `review-20261004-2aa7e7f`,主进程 `2022654`、自动重启零、服务成功,Nginx 保持 active。运行主程序摘要与发布程序一致,业务数据库文件描述符仅匹配当前单库 `smailreverse20261004.db`;管理员忽略缓存刷新后收件箱正常。没有清库或删除历史文件。
- [✓] 用户确认附件下载保存正常,仅覆盖原人工下载;本段业务仍全部使用浏览器操作,没有 API 业务调用、脚本验收或新增源码文件。
- [!] 整体仍未放行:保留三库全功能、邮件客户端加密协议、通知撤权、外部验证、完整恢复续期及最终仅限 Smail 清理等未闭合范围。临时发布解压目录仍待最终清理,不等于清理已完成。
## 普通账号禁用与恢复复审(2026 年 10 月 4 日 06:20)
- [x] 网页确认 `testuser` 已禁用,原标签页已回登录页;原凭据提交一次未进入邮箱。未捕获瞬时错误文案,不推断具体跳转请求。
- [x] 另一旧标签页出现通用“页面加载失败”,点击刷新进入登录页;保留提示可用性及根因待查,不记为清晰的禁用反馈。
- [✓] 超管已恢复启用并核对列表状态“正常”;普通用户原密码重新登录成功,实际读取副本 63,正文、身份、引用时间完整。未改密码、角色、分组或其他凭据,不遗留禁用账号。
- [✓] 管理员原会话仍可打开本人副本 61。用户确认的附件下载保存仅沿用原人工范围;本段无重新下载、跨库摘要校验或协议收发验收。
- [!] 当前浏览器现象不证明禁用前所有旧令牌永久失效,也不证明 SMTP、IMAP、POP3 或通知存量连接撤权通过。三库全功能、外部集成、恢复续期及最终清理初始化仍保留,整体不放行。
## 最终 SQLite 回复闭环复审(2026 年 10 月 4 日 06:00)
- [✓] 管理员对副本 59、普通用户对副本 60 通过页面输入正文并回复,发件箱分别显示 05:54、05:56 发送成功。
- [✓] 超管实际打开回复副本 62、64,核对两种发件身份、新正文、原引用及 `2026-10-04 05:45:15` 时间;原双收件人邮件发件箱显示 05:45 发送成功。本封最终 SQLite 三角色网页收发阅读闭环通过。
- [✓] 主进程仍为 2021557、自动重启零,匹配业务库仍仅 `data/smailreverse20261004.db`,Smail、Nginx active;未重启、清库、部署或删除文件。业务测试全部使用浏览器键鼠。
- [!] 六向迁移和本封收发闭环不代替三库全功能、外部集成、图形客户端、通知 SMTP、恢复续期及最终全新安装验收,整体不放行。
## 六向迁移与最终 SQLite 收信补录(2026 年 10 月 4 日 05:50)
- [x] 接续补录前段排序修复 `61b361a` 已构建部署,网页投递时间顺序实机正常,后续 PostgreSQL 上仍保持;协议原次序未改,回归源码未执行。
- [x] 合法同组编辑已保存,普通用户读取新名称后自行恢复,管理员核对恢复;超过十个字符名称的泛化错误提示仍待整改。
- [x] SQLite → PostgreSQL、PostgreSQL → MySQL、MySQL → SQLite 三条反向迁移已由页面完成,任务及运行证据见云端全项目测试报告。六个跨类型迁移方向已有执行记录,不再重复迁移凑进度。
- [x] 本轮 PostgreSQL 临时建库权限、MySQL 精确目标库新增权限均已撤销;没有全局授权。最终主进程 2021557、05:40:27 启动、自动重启零,运行单库 `/opt/smail/data/smailreverse20261004.db`,两种服务端数据库均无 `smail` 活动连接。历史遗留仍待最终清理。
- [x] 超管新邮件由管理员副本 59、普通用户副本 60 实际阅读,正文、双收件人及 05:45 时间正常;尚未记为此邮件双向回复闭环通过。
- [✓] 用户人工确认附件下载正常保存,保持原证据范围,不扩为跨库附件完整性通过;接续服务正常,复用原浏览器,不清库、不删文件、不操作其他项目。
- [~] 最终 SQLite 双角色回复及超管阅读继续执行;三库全功能仍单独保留,不以六向迁移替代。
- [!] 图形客户端、通知 SMTP 协议及配额、三个外部邮箱、Telegram、本机恢复、完整续期、最终全新安装与仅限 Smail 遗留清理未闭合,整体不放行。
## 迁移提示与回复草稿发送补录(2026 年 10 月 4 日 05:10)
- [x] 补录前段 `62f65e3` 已构建部署、页面实际显示迁移目标目录 `data`;现有回归用例仅补充源码,未执行自动化测试。覆盖下方历史“目录提示仍未修正”状态。
- [x] 补录旧回复草稿 23 发送冲突被拒、未保存内容保留、最新版本发送成功,发送后旧页面重试仍被拒;普通用户副本 57 阅读正常,管理员草稿箱为空。原“回复草稿发送分支待验收”仅在该操作范围内闭合。
- [✓] 本段重新确认云端 Smail、Nginx active、主进程 2020866、重启计数 0;未清库或改变其他项目。
- [~] 网页列表按 ID 而非显示时间排序,正在修正并待云端浏览器复验;POP3、IMAP 协议次序不得随网页调整。
- [!] 三数据库全功能、客户端及通知 SMTP、外部邮箱、Telegram、恢复、续期与最终全新初始化仍待完成;整体不放行。
## SQLite 对象隔离与分组恢复复审(2026 年 10 月 4 日 04:48)
- [x] 补录普通用户读取管理员副本 51、管理员读取普通用户副本 52 被拒绝;仅覆盖已操作对象,不扩大为全套权限或附件隔离通过。
- [x] 补录管理员乙组撤权后旧编辑框提交登录失效、重新登录仅见甲组、普通用户名称未被越组修改的证据。
- [✓] 本节已将管理员恢复甲、乙两组,原密码重新登录成功;用户管理再次显示两组,乙组普通用户原名称、安全码及正常状态保留。未进行合法同组写入测试,也未重建通知凭据。
- [✓] 恢复分组后管理员仍无法读取普通用户邮件副本 52;用户确认附件下载正常保存,下载确认不扩大为跨库后再次下载或摘要校验。
- [!] 数据库迁移目录提示仍未修正;剩余外部集成、客户端、通知 SMTP、恢复、续期、数据库及最终全新部署验收继续保留,整体不放行。
- [✓] 本节仅更新现有两份验收文档,业务均为浏览器键鼠操作;未改源码、未部署、未清库、未删除文件或创建辅助脚本。
## 三库环形迁移回 SQLite 复审(2026 年 10 月 4 日 04:26)
- [x] 补录前段 PostgreSQL 三角色实际退出后密码重新登录成功,以及普通用户通知未授权状态、管理员所属两组可见性;不扩大为完整后端权限通过。
- [✓] 浏览器执行 PostgreSQL 至 SQLite 迁移,任务 `dbmig-1575b96938a183fe63d3864f76b6a24c` 显示已完成,随后仅重启 Smail。
- [✓] 当前运行数据库为 `/opt/smail/data/smailroundtrip20261004.db`,覆盖前文 PostgreSQL 状态;主进程 `2020352`、04:12:47 启动、自动重启零,Smail、Nginx active。
- [✓] 新 SQLite 上超管发送双收件人邮件,管理员副本 51、普通用户副本 52 均阅读完整正文,时间 04:17;两角色回复后超管分别阅读副本 54、56,新增正文及引用时间 `2026-10-04 04:17:28` 正常。
- [✓] 原附件副本 24 忽略缓存刷新,正文、00:56 时间及 JPG 入口保留;用户人工确认下载正常保存仅保留原范围,本节未重新下载。
- [~] SQLite → MySQL → PostgreSQL → SQLite 主链路及本轮三角色网页收发阅读闭环已验证,不等于全部迁移方向或三库全功能通过。
- [!] 迁移页面目标目录文案写 `config`,实际文件位于 `data`,待修正复验;前段对 `config` 目录的不存在检查不作为实际目标目录为空的证据。
- [ ] 外部邮箱、Telegram、图形邮件客户端及通知 SMTP 权限和配额、本机恢复、剩余三库功能及权限、完整续期场景、最终全新安装和仅限 Smail 遗留清理仍未闭合,整体不放行。
- [✓] 本节未改应用源码、未部署、未清库或删除文件,仅更新两份既有验收文档;业务操作全部使用浏览器键鼠。
## PostgreSQL 迁移与网页收发复审(2026 年 10 月 4 日 03:58)
- [x] 补录前段修复 `e97a8ca`:迁移建库权限只读预检及准确错误提示已部署,回归用例仅编译,未运行。无权限预览拒绝及迁移记录见云端全项目测试报告。
- [x] 补录 MySQL 至 PostgreSQL 页面迁移任务 `dbmig-ce285748c7a76dde01461c3080bbd9cd`;迁移后撤销临时建库权限并仅重启 Smail。本节未再次执行迁移。
- [✓] 本节只读核实运行账号 `smail` 无超级用户、无建库权限,当前连接 PostgreSQL `smailmig20261004` 且使用 TLS;主进程 `2019966`、自动重启零,Smail、Nginx active。
- [✓] PostgreSQL 上超管双收件人发送成功;管理员副本 44、普通用户副本 45 均读取完整中文正文及 03:49 时间。两角色刷新后原登录会话保留,尚未重新登录。
- [✓] 普通用户、管理员通过页面回复,超管分别读取副本 47、49,新增正文标识、原文及引用时间 `2026-10-04 03:49:22` 完整保留。
- [✓] 历史附件副本 24 在 PostgreSQL 页面刷新后保留正文、00:56 时间及一张 JPG 下载入口;用户人工确认的下载正常保存沿用原范围,本节没有重新下载,不计为跨库下载复验。
- [~] 三角色当前数据库网页收发阅读闭环已复审;三库往返、重新登录与全套权限、跨库附件下载仍未闭合。
- [ ] 外部安全邮箱、Telegram、图形邮件客户端及通知 SMTP 权限、受保护本机恢复、完整续期场景、最终全新安装与仅 Smail 遗留清理仍待完成;整体不放行。
- [✓] 本节未修改应用源码、未清库、未重启或部署,未创建辅助文件;仅更新现有验收文档。
## MySQL 迁移时区修复复审(2026 年 10 月 4 日 03:08)
- [✓] 连续验收已由 SQLite 经页面迁移至 MySQL `smailmig20261004`;最近登录要求、目标已有库拒绝和预览不提前建库的证据已补录到云端报告。
- [x] 修复提交 `2248190` 已推送、编译并仅部署 Smail 三程序。运行时数据库存储时区统一 UTC,没有批量修改历史时间;新增 Go 用例源码但未执行自动化测试。
- [✓] 超管附件邮件副本 24 从错误的 10 月 3 日 16:56 恢复至 10 月 4 日 00:56;管理员与普通用户原邮件正文和 02:27 时间保留。附件下载保存保留原用户人工确认,不扩充为本轮再次下载通过。
- [✓] 超管新发邮件显示成功;管理员副本 36、普通用户副本 35 均读取完整正文,时间为 03:04。03:06:51 仅重启 Smail 后两页忽略缓存刷新,正文、身份和时间仍正确。
- [~] 本次时区缺陷的旧邮件、新写入及重启持久化页面复验通过;当前仍为 MySQL 连续验收,未清库。源库、历史库、测试包、迁移内部备份及旧权限仍待最终仅限 Smail 的清理。
- [ ] 迁移后双角色回复、重新登录与全套授权、旧附件重新下载、三库往返及全功能仍待完成。外部邮箱、Telegram、客户端协议与通知限制、本机恢复、最终安装等门槛继续保留,整体验收不放行。
## 真实换证与规则证据补录(2026 年 10 月 4 日 02:30)
- [✓] 当前 SSL 页面直接读取外部续期源文件,不再指向独立旧副本;本轮未修改路径或应用源码。
- [✓] 已执行真实提前续期,新证书序列号变化,覆盖 `example.com` 和 `*.example.com`,有效期至 2027-01-01 17:23:51 UTC。CA 复用有效授权,不计本轮新 DNS 挑战通过。
- [✓] 现有续期服务成功发布证书并平滑重载 Nginx。交互 SSH 的原生部署诊断确认服务器本机 443、465、587 STARTTLS、993、995 均提供相同新证书,证书链与主机名严格校验通过;不替代公网客户端认证收发验收。
- [✓] Smail 主进程 `2017557` 未变、自动重启次数为零;换证后超管页面刷新仍登录,发送新邮件成功,管理员副本 32、普通用户副本 33 均已读取完整正文。
- [x] 补录前轮旧草稿 23 发送冲突被拒绝、最新内容不被覆盖、未见新增发件及收件副本的页面证据;本轮未再次触发发送,不扩大为三库全部角色通过。
- [x] 补录前轮普通用户主题包含规则:本人副本 27 进入广告箱,管理员本人副本 28 仍在收件箱;页面删除规则后相同主题新邮件进入普通用户收件箱,本轮复核副本 30 正文正常。未复核广告箱旧副本后续状态。
- [!] 三个外部安全邮箱均未绑定,验证码均已过期;保留弹窗,等待持有人重新发送并输入验证码,不以发送提示替代送达及绑定证据。
- [ ] 自然续期调度、全新 DNS 挑战、存量连接连续性、外部邮箱、Telegram、图形邮件客户端与通知权限协议验收、本机恢复、三库全功能、最终安装和遗留清理仍待完成,整体不放行。
- [✓] 本轮没有清库、重新部署应用、创建备份、删除文件或修改其他项目配置;仅更新 Smail 专属证书并使用现有服务重载 Nginx。业务操作仍全部使用浏览器键鼠。
## 附件与通知凭据页面复审(2026 年 10 月 4 日 01:35)
- [✓] 本轮 SQLite 单张 JPG 完成草稿保留、发送、三角色本人副本读取及附件链接点击;用户人工确认下载正常保存。未独立检查图片完整性、摘要,不扩大为大附件、多附件或三库附件全通过。
- [✓] 同组管理员逐账号开启、首次生成后列表下方显示、轮换,以及普通用户错误密码拒绝展示、正确密码查看本人凭据的页面路径已执行。
- [✓] 普通用户不刷新旧页面,验证本人密码后读取到与管理员当前查看一致的轮换后凭据;主动隐藏已执行。
- [✓] 管理员撤销 `testuser` 授权并确认密码后,普通用户在旧页面再次验证未显示凭据,状态自动变为未开启,查看入口消失。配额保持 10 个收件人/分钟、100 个收件人/UTC 日、10 个收件人/封及 1 MiB/封。
- [!] 超管最终刷新显示三个测试账号未开启,`xuans` 已开启;与交接记录存在差异,本轮未操作该账号授权,来源待核实并保留现状。不得将普通用户临时授权关闭写成所有账号关闭。
- [ ] 页面凭据撤权不等于 SMTP 旧连接失效。邮件客户端协议、通知只发不收及配额、外部安全邮箱、Telegram、真实换证、本机恢复、三库全功能、旧回复草稿发送冲突及最终全新安装仍未闭合。
- [✓] 本轮未改源码、未部署、未重启、未清库、未操作其他项目;Smail 和 Nginx 服务检查正常。没有新增辅助脚本或保存凭据的文件。
## 回复草稿并发提示实机复审(2026 年 10 月 4 日 00:46)
- [✓] 修复前已用管理员双标签页确认旧版本保存被拒绝且不覆盖新版本,原提示误报为草稿内容无效。
- [x] 修复提交 `23eda3a` 已推送并部署,保存与发送均保留回复草稿冲突类型。六种组合的回归用例源码已补充并编译,未运行自动化业务测试;发送冲突尚未实机覆盖。
- [✓] 云端部署后,未刷新的旧页点击保存显示准确冲突提示,并保留未保存内容;另一个标签页刷新后仍为最新已保存主题,完整正文未变。本轮未发送邮件。
- [✓] 超管无法读取管理员私人草稿,点击草稿箱可以回到本人列表;不扩大为全部权限组合通过。
- [✓] 当前版本 `review-20261004-23eda3a`,三个程序版本一致,主程序干净构建;前端及插件复用未变源码的对应产物。归档、落盘程序及运行中主程序摘要核对一致,主进程 `2017557`、自动重启零,Smail 与 Nginx 正常。
- [!] 保留扫码页和待附件草稿,继续同轮验收,不重复清库。附件人工配合、外部安全邮箱、Telegram、邮件协议与通知撤权、证书换证、本机恢复、三库全功能及最终安装未完成,整体验收不放行。
## 页面资源失效恢复实机复审(2026 年 10 月 4 日 00:28)
- [x] 修复源码 `6d5010b` 已完整构建并部署;回归用例源码已补充,未以自动化业务测试替代浏览器验收。
- [✓] 已加载修复代码的超管列表页遇到服务端版本切换,邮件详情模块真实返回 404;仅点击一次标题后自动刷新,保留 `#/detail/22`,恢复登录身份并读到完整正文。
- [✓] 管理员在写信状态遇到列表模块真实 404,页面提示先保存而不刷新,主题、收件人与正文完整保留;恢复新版后保存为草稿 23,刷新后内容完整。超管此前命中缓存、未触发错误的尝试不计通过。
- [✓] 最终运行新版,00:26:24 启动,主进程 `2017397`、自动重启次数为零;运行中程序摘要与发布收据一致,Smail 和 Nginx 正常。密集切换曾触发启动限流,已仅恢复 Smail,未修改限流配置、数据库、证书或其他项目。
- [ ] CSS 单独失效、同构建重复恢复限次、离线、存储受限、设置表单保护仍待实机覆盖;首次部署前未加载修复代码的旧页面仍需手动刷新,不扩大本轮结论。
- [!] 普通用户附件草稿 10 和用户扫码标签页保持不动;附件仍待手动添加。三库全功能、外部安全邮箱、Telegram、邮件协议与通知撤权、证书续期、本机恢复和最终安装等未闭合,整体验收不放行。
## 草稿收发与微信排版复审(2026 年 10 月 3 日 23:55)
- [✓] 用户确认微信成功结果页单行排版,覆盖下方该项等待确认状态;失败结果页真实手机验收仍保留。
- [✓] 云端当前 SQLite:草稿 20 刷新恢复后发送,发件箱显示发送成功、草稿箱移除该草稿,普通用户发件副本 20、管理员收件副本 21、超管收件副本 22 均读取全文。
- [!] 部署前旧页面加载旧版本懒加载 CSS 返回 404,超管邮件详情页本轮复现;页面刷新后可恢复,但升级过程静态资源兼容性尚未整改。
- [!] 附件草稿仍需用户通过文件选择器添加非敏感附件,未以工具权限拒绝判定产品上传失败,也未将无附件草稿计为通过。
- [ ] 三库全部功能、Telegram、外部安全邮箱、邮件客户端协议与通知凭据撤权、证书续期、本机恢复及最终发布收尾继续保留;本轮没有清库或重复部署,整体未完成验收。
## 微信扫码页视觉复审补充(2026 年 10 月 3 日 23:40)
- [✓] 用户最新手机截图确认成功结果页样式恢复;原无样式问题的成功分支复审通过。
- [x] 底部提示单行排版已精确修改 CSS,提交 `220e65e` 已构建部署,不修改绑定逻辑或中文内容。
- [ ] 新版单行显示效果与失败分支仍需真实微信复核,不能据此认定全项目验收完成。
## 微信扫码结果页修复(2026 年 10 月 3 日 23:35)
- [✓] 已确认正式构建工作树与日常工作区的样式换行不同;原摘要直接使用嵌入字节,存在浏览器解析后的摘要失配问题。
- [x] 已统一内嵌 CSS 的换行后再输出与计算摘要,保留严格安全策略;修复提交、正式构建和云端三个程序部署已完成。
- [x] 已新增 LF、CRLF、CR 与成功、失败分支的 HTML 解析回归用例源码,未运行自动化业务测试。
- [✓] 上一轮动态跨组编辑被拒绝、目标用户名未改变;本轮恢复目标分组并完成普通用户登录及正文阅读、管理员刷新成员列表复验。
- [ ] 用户手机重新扫码视觉复审。截图已证明上一版无样式,不将程序编译、服务启动或普通页面正常当作本项通过。
- [ ] 三库全功能、外部邮箱验证码、Telegram 代理认证、图形邮件客户端、通知协议撤权、真实续期与最终安装等剩余验收继续保持未完成。本轮不作生产放行结论。
## 邮件恢复与访问隔离续验(2026 年 10 月 3 日 22:51)
- [✓] 本轮完成普通用户测试邮件从已删除恢复到收件箱,收件副本 19 的中文正文完整;原有两封邮件仍在,没有永久删除邮件。
- [✓] 按完整主题搜索只返回测试邮件;真实键盘清空搜索后恢复全部三封邮件。工具填空未触发筛选恢复的现象未在键盘操作中复现,不据此改动源码。
- [✓] 管理员发件副本 18 仍显示发送成功、正文完整,未随收件人的移动及删除操作改变。
- [✓] 普通用户访问管理员副本 18、管理员访问普通用户副本 19 均被拒绝,未显示正文;管理员从可读副本切至拒绝页面时旧正文未残留。
- [✓] 两个角色在拒绝页面点击返回邮件列表均成功。本结论只覆盖本轮复验,历史导航异常原因未证实。
- [x] 前轮黑名单移除、恢复收信、广告箱读取及软删除证据已在测试报告补录,与本轮直接执行的恢复操作分开描述。
- [ ] 三库完整功能、邮件协议、附件、外部安全邮箱、消息推送、续期及受保护本机恢复等验收范围不变;整体仍未放行。
## 微信扫码结果页精简与部署(2026 年 10 月 3 日 22:25)
本节更新当前运行版本,仍为全新初始化后的连续验收;不重复清库,不生成备份,不操作其他项目。
- [x] 微信扫码结果页改为状态、两步操作指引和简短提醒;成功页面明确仍需原设备核对昵称并确认,失败页面保留重新扫码及以原页面状态为准的提示。HTML、CSS 继续独立维护,没有引入脚本、外部资源或固定域名。
- [x] 代码提交 `7e28735` 已推送。三个 Linux 程序构建成功,结果页回归用例仅编译,未运行自动化业务测试。
- [✓] 运行版本为 `review-20261003-7e28735`,三个上传文件及运行文件摘要一致。仅重启 Smail,主进程 `2015884`、自动重启 `0`;Smail 与 Nginx 均正常运行。
- [✓] 部署后浏览器真实登录超级管理员成功,收件箱仍显示已有邮件,账号微信通知页面仍显示原绑定及通知开关;没有执行解除绑定或自动确认重新绑定。
- [ ] 成功和失效结果页的手机实际显示、重新扫码授权和原设备确认仍待真人配合,不能将编译、部署或已有绑定状态当作该项通过。
- [ ] 下方三库、邮件协议、附件、外部安全邮箱、Telegram、证书更新等未完成验收保持原范围;整体尚未放行。现有发布压缩包仍是此前候选包,本次仅部署可执行文件。
## 同版本部署与密送隐私复验(2026 年 10 月 3 日 21:54)
本节更新当前状态,保留下方历史证据。继续全新初始化后的 SQLite 验收,不重复清库;本次没有创建服务器备份,也没有操作其他项目。
- [✓] 主程序、管理工具和配置工具统一为 `review-20261003-316071b`。三个上传文件校验通过,21:45:57 仅重启 Smail,主进程 `2015368`、自动重启 `0`,运行程序与本地产物摘要一致,Nginx 保持运行。此前管理工具旧版本及 `dev` 标识已纠正。
- [✓] 管理员通过发件箱打开邮件 13,显示密送地址;切换到无密送的邮件 4 后,密送名单没有残留。
- [✓] 普通用户通过收件箱打开邮件 14、超管通过收件箱打开密送副本 15,均正常显示中文正文且不显示密送名单。此结论覆盖当前 SQLite 云端浏览器,不扩大为全部协议或三库全功能通过。
- [✓] 同一浏览器注销换账号后,普通用户访问管理员的邮件 4、超管访问普通用户的邮件 14 均被拒绝,未显示他人正文。
- [~] 普通用户被拒绝后的返回列表点击曾未跳转,直接地址导航成功;超管对应返回按钮正常。控制台无错误,原因未定,需复核,不能记为通过。
- [✓] SSL 页面重启后仍回显 `/var/lib/smail-acme-tls/certificates/example.com.crt` 与配套 `.key`,保存按钮禁用。下方独立旧证书路径的配置问题已修正;真实换证及网页、邮件协议采用新证书仍未实测。
- [x] 发布候选包已构建,归档仅包含程序和空运行目录,不携带数据库、配置、证书或密钥;不等于正式发布放行。回归源码只做静态检查与编译,未运行自动化业务测试。
- [ ] Telegram 代理认证、三个外部安全邮箱真人验证码、附件上传下载、465/587/993/995 图形客户端收发及通知凭据撤权、本机恢复、真实续期、最终测试遗留清理仍待完成。25 端口按授权可略过、不计通过。
## 微信授权结果页优化(2026 年 10 月 3 日 21:10)
- [x] 按用户手机截图修复纯文本授权结果页:增加手机视口、状态卡片、中文步骤和失败提示;页面模板、样式、Go 渲染及回归源码集中在 `backend/controllers/wechatcallback`。成功仅表示授权完成,仍需原会话确认绑定。
- [✓] 代码提交 `4a927a3` 已推送,21:09:12 构建部署后仅重启 Smail;运行摘要一致,Smail、Nginx 正常。桌面浏览器打开无授权参数的结果页,失败卡片及中文操作指引正常显示;此操作不代表实际扫码失败。
- [✓] 超管本人微信已显示绑定,重启后点击重新加载仍保留绑定,通知开启、正文关闭。未解除或替换现有绑定。
- [ ] 新版成功页真实扫码及手机微信布局仍需用户协作复核;测试包仅编译,未运行自动化用例,新库消息实际送达仍待接收确认。
- [!] 证书续期部署审查发现:续期服务发布 `/etc/nginx/smail/tls.pem`,但当前 Smail 邮件证书配置指向独立的 `domain-fullchain.pem`、`domain-private.key`。当前证书指纹相同且覆盖根域和泛域;未来续期后的邮件证书同步尚未闭环。本段未修改证书配置,需继续修正并验收。
## 三库范围确认与消息推送续验(2026 年 10 月 3 日 20:58)
本节更新当前状态;以下历史记录中的未明确连接原因,以本节直接诊断结果为准。继续现有新库验收,不重复初始化,不将历史送达结果计入新库。
- [✓] 验收范围仍包含 SQLite、MySQL、PostgreSQL;三库核心站内业务与重启持久化已有下方记录,并非三库全部功能通过。25 端口可跳过或失败略过,不计通过;465、587、993、995 不豁免。
- [✓] 20:56 复核 Smail、Nginx 均为运行中;Smail 主进程为 `2014413`、自动重启次数为 `0`。运行程序摘要与 `review-20261003-857491c` 构建一致。
- [!] Telegram 无凭据代理连通性诊断明确返回 `407 Proxy Authentication Required`,要求 Basic 认证,尚未建立到 Telegram 的 CONNECT 隧道。不代表机器人令牌错误,也不证明代理上游可用;待用户提供认证配置方案,不读取其他项目配置或取消认证。
- [x] 新库微信系统配置已通过超级管理员页面保存,后台及网页授权域名统一为 `web.example.com`;前段仅重启 Smail 后,个人扫码绑定入口可用。
- [~] 超管微信绑定二维码已打开并提示用户本人扫码;20:56 页面仍显示尚未绑定,未取得新库绑定及消息送达证据。
- [ ] 外部安全邮箱真人验证、附件收发下载、邮件客户端协议与撤权、证书续期应用、正式发布及仅限 Smail 的测试遗留清理继续保留,整体验收未完成。
## Telegram 代理链路续验(2026 年 10 月 3 日 20:47)
本节补充下方三库记录并更新当前构建状态。后台仍为 `web.example.com`,未重复清库,也未修改同机其他服务。
- [✓] 已确认旧实现的回调检查忽略代理设置,且推送插件拒绝非空代理。修复提交 `857491c` 已推送,并于 20:43:35 仅重启 Smail 部署。
- [x] Telegram 主进程和沙箱出站使用同一套本机 HTTP 代理校验;仅允许回环 IP 和显式端口,仍限制目标为 Telegram HTTPS 接口,保留 TLS 验证及插件网络隔离。
- [x] 补充代理地址、跨目标请求与重定向、沙箱通道、代理拒绝和配置失效相关回归源码;主程序及插件构建成功,相关测试包仅编译,未执行自动化验收。
- [✓] 运行主程序摘要与上传产物一致,Smail 与 Nginx 为 active,刷新后台后已有 SQLite 邮件仍显示。
- [!] 浏览器点击检查回调仍显示无法连接 Telegram,未配置新回调、未取得个人绑定或真实送达证据。不能将代码修复或代理监听当作推送通过。
- [!] 进一步细化脱敏网络诊断的补丁被工具策略拒绝,未写入;当前失败阶段尚未明确。没有修改代理服务或放宽安全边界。
- [ ] 微信新库配置、外部邮箱真人验证、附件、邮件客户端协议、证书和正式发布收尾仍待完成;25 端口豁免规则及三库核心业务结论保持不变。
## 三库与安全码恢复续验(2026 年 10 月 3 日 20:24)
本节优先于以下历史状态。当前后台为 `web.example.com`,邮件域名为 `example.com`,运行目录为 `/opt/smail`。三库记录根据同一线程已完成的云端浏览器验收补录;20:08 起的恢复修复和浏览器复测为本段直接执行记录。当前为连续验收,不重复清库,不继承旧部署验收结论。
- [✓] SQLite、MySQL、PostgreSQL 已分别完成全新向导初始化、三角色登录、超管向管理员及普通用户发信、两角色读取中文正文并回复、仅重启 Smail 后复核持久化。每个实例仅使用一种业务数据库;此项不代表三库全部功能通过。
- [✓] 管理员安全码独立恢复缺口已修复并部署,代码提交 `c47155d`。未验证外部邮箱时,可用安全码完成身份验证和重置;旧网页会话刷新后退出,新密码登录成功;旧批次未使用安全码被拒绝。
- [✓] 管理员密码已恢复为约定测试值,重新生成安全码后退出并登录,不再出现强制补充另一种恢复方式的提醒。超级管理员公网找回仍被阻止。
- [x] 已补充管理员、普通用户、超级管理员边界及核销、失败次数、重置后撤销的回归源码,并完成编译检查;未执行自动化用例,不计为业务验收通过。
- [x] 安全码桌面三行四列布局已在管理员和普通用户原失败窗口宽度复测;其他桌面尺寸与移动端不包含在本结论中。
- [!] 25 端口按用户许可可不测或失败后跳过,不计通过、不阻断本次验收。465、587、993、995 不在豁免范围,监听状态不是协议验收。
- [!] 附件上传、发送及下载尚未闭环;MCP 文件访问限制不等于应用上传失败。需用户通过正常文件选择操作协助,不用脚本或接口绕过。
- [ ] 新库外部安全邮箱真实收件绑定、微信与 Telegram 初始化及实际送达、客户端协议及凭据撤销、证书续期应用、最终发布打包和遗留清理仍待完成。
整体验收尚未完成。当前云端为 `review-20261003-c47155d` 验收构建,不是正式发布放行。
## 插件升级与规则续验状态(2026 年 9 月 30 日 22:55)
本节优先于以下历史记录。当前运行 `ceacd99-audit`,保持现有 MySQL 单库数据;不是清库首次安装验收。详细摘要、备份及浏览器证据见《云端全项目测试报告》顶部。
- [x] 隔离插件受控出站实现已提交、推送和部署;保留独立网络、chroot 与非 root 身份,通过本地 socket 按插件权限限制出站。回归用例仅补充源码,未执行自动化测试,完整出站安全边界待复验。
- [✓] 22:37:28 仅重启 Smail 完成升级;22:50:24 Smail 与 Nginx 均为运行中,主进程 `1771758`、自动重启 `0`,未操作其他项目。
- [✓] 微信子进程降权、独立网络命名空间、出站 socket 权限及 NoNewPrivs 已核实;这不是消息推送送达证据。
- [✓] 管理员个人规则精确匹配后移入广告箱、超管副本不受影响、非匹配主题保留收件箱、删除测试规则后相同主题不再移动均完成浏览器实测;相关正文均已读取。本轮仅清理该测试规则,保留邮件。
- [x] 22:35 Smail 单库及部署文件备份完成,退出状态和 SQL 完成标记已检查;未进行同一时点备份恢复演练。
- [!] Telegram 运行配置应用失败和页面连接失败仍存在;无凭据 TLS 连接诊断超时,尚未明确根因。微信真人扫码、附件人工上传与外部邮箱协作仍待完成。
- [ ] 混合投递列表状态、通知凭据协议隔离与轮换、图形协议客户端、完整恢复、三种数据库选项和迁移、清库首次安装、干净可复现发布、证书续期及容量验收仍有未完成项。
全项目验收仍未完成,不以本次编译、服务运行或收信规则专项通过作为发布批准。
## 接续验收状态(2026 年 9 月 30 日 22:15)
本节优先于以下历史状态;保持现有运行版本和数据库,本轮未部署代码、未重启服务。详细证据见《云端全项目测试报告》顶部。
- [✓] 管理员修改为临时密码及改回指定测试密码,两次均自动进入正确登录页且新密码成功登录;普通用户与管理员改密跳转实机复测已完成。
- [!] 超管改密需已验证外部安全邮箱,当前缺少该前提,尚未完成实机跳转复测,不绕过验证。
- [x] 管理员改密后旧密保问题为空、页面提示需重新设置安全码;最终密码及角色恢复,旧凭据的逐项撤销仍需验证。
- [x] 超管本人微信绑定经密码确认后可以显示二维码,已取消弹窗;真人扫码、绑定及通知送达未通过验收。
- [!] 已核实 Linux 插件隔离与直接出站实现不匹配:独立网络命名空间、无路由条目、无沙箱 DNS/CA 目录,而客户端直接 DNS/TCP;需补全受控出站通道,不能取消安全隔离。
- [!] Telegram 主进程检查回调显示无法连接,另需定位网络失败阶段;不能与插件隔离缺口混同。代理输入与插件拒绝非空代理的行为也需统一。
- [!] 附件草稿仍无附件且未发送,附件收发验收尚未完成。
- [✓] Smail 与 Nginx 持续运行,主进程及自动重启次数未变化,其他项目未操作。
## 最新修复部署状态(2026 年 9 月 30 日 22:00)
全项目仍未完成验收。本节优先于以下旧记录;本次为保留数据的增量部署与复测,不是清库首次安装。详细证据见《云端全项目测试报告》顶部。
- [✓] 修复改密后跳往 `/login` 的 404,源码提交 `3155353` 已推送并编译部署;普通用户两次改密均自动进入正确登录页,新密码和恢复后的指定测试密码均成功登录。
- [x] 已补充三角色跳转及身份清理回归断言,未运行辅助测试脚本;管理员和超管分支仍需各自实机复测。
- [✓] 安全码重新生成后旧批次被拒、新批次可验证;成功验证的码在新流程重复使用被拒,另一未使用码可继续验证并完成密码重置。
- [✓] 重置后指定密码登录成功,安全设置显示无有效离线恢复码;不将页面状态视为所有旧码、恢复票据和协议凭据的直接撤销验证。
- [x] 部署文件及原主程序、配套工具已备份;沿用 21:31 数据库检查点。尚未完成文件与数据库同一时点备份及恢复演练。
- [✓] 21:50:48 仅重启 Smail 完成升级;22:00 服务运行中,主进程 `1768882`、自动重启 `0`,Nginx 运行中。上传与运行主程序摘要和本机一致。
- [ ] 当前产物已记录源码版本与摘要,但仍含 `vcs.modified=true`;干净源码可复现发布、清库首次安装和三种数据库部署选项尚未闭环。
- [!] Telegram 启动配置失败仍存在;微信真人扫码、附件人工上传及外部邮箱协作仍需继续。
- [ ] 完整账户恢复与凭据撤销、外部收发、图形协议客户端、备份恢复、证书续期和容量验收保持未完成。
## 最新续验状态(2026 年 9 月 30 日 21:28)
整体验收仍未完成,不能标记可发布。详细证据与限制见《云端全项目测试报告》顶部的同日续验章节。以下旧章节不应覆盖本节结论。
- [✓] 当前入口为 `web.apmmk.cn`,邮件域为 `apmmk.cn`;不再使用属于其他项目的 `example.com`。
- [✓] 三角色站内邮件收发阅读回复、草稿主送抄送密送、多组管理员与降级旧会话失效、逐账号通知授权及密码查看、安全码查看保护,已取得本轮浏览器证据。
- [✓] 混合投递中本站账户实际收到,无效域名失败,详情计数准确;邮件搜索、广告箱移动与恢复通过。
- [ ] 部分成功的发件列表状态需优化;附件上传受 MCP 工作区权限阻塞,尚未验收附件收发。
- [ ] 当前为 MySQL 单库配置及连接证据,并非仍运行两个 SQLite;三个数据库选项与迁移、备份恢复仍需完整验证。
- [ ] 当前部署产物含未提交修改标记,需补齐产物对应关系;主进程按设计使用 root 创建插件隔离,不应直接降权。微信插件实机降权和网络隔离已核实,主进程权限范围及全部插件安全路径仍待复核。
- [x] 21:31 完成受保护的 Smail 单库备份,使用指定数据库凭据成功,退出状态与摘要检查通过;未执行恢复,不能标记恢复演练通过。
- [ ] 外部邮件往返、协议客户端、通知发信隔离与轮换、微信及 Telegram、完整找回、证书续期、容量和最新构建首次安装流程仍有未验收项。
本轮为连续验收,没有重置数据库或重新部署,不能表述成完成最新构建的清库生产全流程。
## 以下为历史验收状态
## 当前验收结论(2026 年 9 月 27 日)
整体部署验收尚未完成,不予标记为可发布。以下为当前版本的浏览器增量验收;后面的历史脚本、接口及双库记录不作为本轮放行证据。
### 验收范围与运行版本
- 邮件主域名为 `example.com`,后台为 `web.example.com`;测试配置不是产品固定值,也不是验收标准本身。
- 运行目录为 `/opt/smail`。本轮服务只读检查为运行中,主进程为 `1313919`,重启计数为 `0`;未停止、部署或清理服务,未操作同机其他项目。
- 本轮源码检查点为 `ed6ec16`,包含通知凭据状态同步修复 `6a801c1`;云端主程序摘要为 `946849b29194568104cc9542df37cfb79bc0683ee0c052891e99659d800fce4b`。
- 本轮为既有多账号、旧会话回归的续测,不清库重建。下一轮完整首次安装验收仍需按已授权范围清理 Smail 环境、部署最新构建并清理浏览器缓存。
- 业务操作仅通过浏览器点击、输入和页面导航完成;没有直接请求接口、执行页面脚本、命令行协议测试或辅助测试脚本。交互式 SSH 仅检查 Smail 服务与主程序摘要。
- 状态含义:`[ ]` 未开始;`[~]` 进行中;`[x]` 已完成,等待复审;`[✓]` 仅所述范围复审通过;`[!]` 缺陷或存在阻塞。
### 当前已获得的浏览器证据
- [✓] 客户端配置区的 IMAP、POP3、SMTP 三卡并排,协议名与收发信服务两行显示;服务器、端口和加密方式在当前桌面宽度下各占一行。此项仅证明布局,不证明协议连通性。
- [✓] 通知授权被管理员关闭后,普通用户保留的旧凭据验证框提交本人密码,页面自动转为未开启并隐藏验证框和明文入口,无需刷新;错误密码不展示凭据。此项不证明 SMTP 实投或真实限流。
- [✓] 多分组管理员降为普通用户时,保留两个分组会被明确阻止;选择乙组后可保存。旧管理员会话继续保存组内用户资料时被要求重新登录,原资料未被修改。
- [✓] 02:21 起恢复验收基线:将 `auditadmin` 从普通用户设为管理员,分组管理立即使用多选框;同时选择甲、乙两组,确认当前超管密码后保存。原普通用户会话在下一次操作时失效。
- [✓] `auditadmin` 重新登录显示管理员;用户管理仅显示甲、乙两组,展开后两组都有本人,甲组还能管理 `auditmember`;未显示默认组、超管和 `auditoutside`。
- [✓] 中文草稿保存并从草稿箱重新打开后,收件人、主题、正文保留。邮件标识 `20260927-0224` 从管理员发给超管,发件箱显示发送成功,超管收件箱实际收到并打开核对内容。
- [✓] 新建反向邮件 `20260927-0230` 从超管发给管理员,管理员收件箱实际收到并打开核对中文正文和地址。此项是新邮件反向投递,不是回复功能验收。
- [✓] 将上述反向邮件从详情页删除,邮件进入已删除列表;选中后移动到收件箱,原主题和正文预览重新出现。没有永久删除邮件或触碰其他邮件。
- [✓] 投递到 `auditfailure@example.invalid` 的测试邮件 `20260927-0235` 先显示已提交,随后发件箱显示发送失败。点击查看详情显示已接收零、失败一及收件域名解析失败,未误报送达。
### 本轮发现与待整改事项
- [!] 邮件详情页没有回复入口,源码也没有对应操作;不能以反向新建邮件替代回复验收。下一步补齐入口与收件人、主题、引用内容衔接,再部署后通过浏览器复核。
- [~] 发给不存在本站账号的邮件 `20260927-0232` 被超管接收,发件箱显示成功。源码存在未知收件人按策略转交超管的逻辑;此例不属于投递失败。仍需核对该策略的配置可见性、产品预期和普通用户隔离边界,不应擅自改变收件策略。
- [ ] 外部邮件往返、附件完整性、抄送与密送、回复流程、混合收件人部分失败、重试和重启后的队列一致性尚未取得当前版本的完整浏览器验收证据。
### 仍须完成的发布门槛
- [ ] SQLite、MySQL、PostgreSQL 三种部署选项必须每次仅使用一个所选数据库;分别验证首次安装、重启、迁移、数据完整性及不生成第二业务库。发现单个 SQLite 文件不等于三种选项全部通过。
- [ ] 通知服务按账号授权,管理员只能管理所属分组;普通用户不能自行开启,但获授权后可验证本人密码查看本人凭据。继续覆盖越权、授权撤销、改组和重置凭据后的访问回收。
- [ ] 通过允许的交互式用户界面验证通知 SMTP 实际投递、配额、旧连接失效,以及通知凭据不能用于 IMAP、POP3 和网页登录。设置页面保存成功不等于协议验收完成。
- [ ] 根域名与泛域名证书覆盖、邮件 DNS 记录、真实公网协议连通性、自动续期及无停机维护仍须逐项保留当前证据。
- [ ] 当前发布流程旧静态资源清理、最新构建部署、升级与回滚、容量和恢复验证仍未闭环;不得以旧发布包或历史测试放行。
- [ ] 超管保护性本机 IPC 恢复、真实安全凭据撤销、外部安全邮箱及其他原发布门槛保持未完成,按后文原清单继续复核。
当前测试基线:`auditadmin` 已恢复管理员并属于甲、乙两组;`auditmember` 属于甲组,`auditoutside` 属于默认组。通知授权关闭,限额配置保留;本轮测试邮件继续保留为验收证据。账号密码、通知明文凭据和服务器密码不得写入本文件。
## 历史记录(以下不作为当前版本验收结论)
以下保留原阶段记录。章节中的当前、线上、候选、双库、接口或脚本通过等表述,仅指该记录发生时的版本与方法;与本轮单数据库要求、浏览器键鼠验收和运行状态不一致时,以本节以上的当前清单及后续实测为准。
### 当前进展:管理员恢复事务通过,线上跳转严格验收失败
- [✓] 2026 年 9 月 18 日恢复服务 24 项、协议凭据 8 项远程隔离回归通过,零失败、零跳过;真实 SQLite 和 Unix Socket 覆盖重置提交、四阶段撤销回滚及目标歧义拒绝。
- [✓] 02:48:57 测试单元正常退出,峰值 78.1 MiB、交换空间为零;终态、二进制摘要、双库完整性和线上服务收尾核对完成。
- [✓] 修复传输检查只记录而不拒绝 8001 内部端口跳转的验收缺口,六项远程隔离回归通过;严格检查保留失败明细并以非零退出码拒绝放行。
- [!] 03:00 严格线上验证明确失败:8001 仍跳向内部 8002。七个 TLS/STARTTLS 入口通过不等于公网配置通过,完整候选尚未正式部署。
- [!] 正式管理员恢复命令、浏览器会话退出、真实协议连接撤销、无停机续期和其他原发布门槛仍未完成,整体生产放行继续不通过。
详见《管理员恢复事务验收记录》和《反代跳转验收整改记录》。下方阶段记录保留历史结论,不得将旧检查器的 `passed` 当作严格跳转验收通过。
### 当前进展:无停机 HTTP 备用方案真实挑战受阻
- [✓] 候选支持显式 HTTP Webroot,不抢占端口、不停止 Nginx;41 项远程隔离回归通过,保留默认 DNS 及校验、回退机制。
- [✓] 02:25 全新测试账号挑战失败期间,两站点 138 次 HTTPS 探测通过,四个线上服务进程、正式文件和旧续期任务均未变化。
- [!] CA 对五域名 HTTP 挑战均报告 403,但对应 Nginx 日志为 200,公网差异仍待定位,不能启用 HTTP 模式。DNS 专用授权仍缺失,线上无停机自动续期尚未落地,整体生产放行仍不通过。
详见《HTTP无停机续期验收记录》。以下各阶段结论仅覆盖各自验证范围。
### 当前进展:完整候选反代隔离运行通过
- [✓] 2026 年 9 月 18 日,`review-c1dd533` 完整 Linux 候选六文件上传至 47 服务器,长度、摘要、ELF 格式核对通过;主前端和 Telegram 界面均使用新生产构建。
- [✓] 02:07:19 开始的新空实例通过真实独立 Nginx 反代验收,应用 8001/8002、公网 443、可信代理配置均通过正式 API 生效;HTTP 跳转和恢复页登录地址不再继承内部 8002。
- [✓] 两个真实来源的登录限流相互隔离,伪造转发头不能绕过已触发的限制;首次安装、三协议认证、内部 25 中文附件收信、过载恢复、双库完整性通过。
- [✓] 线上四个服务进程及 InvocationID 不变,线上无测试邮件,未停止业务服务,未发生新增 OOM;6 项测试收尾异常模拟回归通过。
- [✓] 最新工具默认直连回归通过;02:15 两站点可信 HTTPS、MySQL 就绪和服务状态收尾通过,02:16 六项收尾回归补齐持久日志,四个工具的本机及远程摘要一致。
- [!] 候选尚未替换线上版本,浏览器业务闭环、真实恢复邮件、管理员恢复撤销、DNS 自动续期、容量与灾难恢复等门槛继续未完成。隔离通过不等于线上配置已经整改生效。
详见《完整候选反代隔离验收记录》。下方较早章节保留历史阶段状态,当前增量结论以上方为准。
### 当前进展:远程生产前端构建完成
- [✓] 2026 年 9 月 18 日 01:30,完整锁定依赖下远程前端回归 24 个文件、185 项通过,零失败、零跳过。
- [✓] 修复维护窗口停止构建超时会跳过服务恢复的问题,11 项隔离回归通过;保留 128 MiB 系统预算,受限前端生产构建成功。
- [✓] 01:31:26 至 01:32:07 授权窗口内仅暂停 MySQL、Scert,构建峰值 758.5 MiB,交换空间为零。两服务已恢复,数据库就绪、两站点可信 HTTPS 页面均通过;Smail、Nginx 主进程未变。
- [x] 新前端产物与源码及嵌入目录核对完成,待完整 Linux 候选构建、隔离首次安装及正式部署复审。
- [!] 尚未替换线上应用或续期任务。公网端口、可信代理的线上验收及其他生产门槛继续未完成,不能以构建成功代替放行。详情见《远程前端构建验收记录》。
### 当前候选:可信代理客户端地址整改
- [✓] 可信代理地址解析候选及真实隔离 Nginx 双来源验证通过,默认不信任任何代理;登录限流和安全验证共用解析,原始连接地址不变。
- [✓] 控制器 85 项、HTTP 层 65 项完整远程回归通过,另有 1 项浏览器夹具跳过;详情见《可信代理地址整改记录》。候选尚未构建为正式应用或部署,不能将线上代理 IP 问题标为验收完成。
- [!] 公网恢复地址仍继承内部 8002,浏览器业务流程、管理员恢复撤销及其他生产门槛保持未完成。
### 当前状态:远程主机 2026 年 9 月 18 日凌晨无停机续期整改
- [✓] Nginx 已迁移到已发布证书目录,不再直接读取 ACME 签发产物;Smail 8001/8002 和其他站点配置未修改。
- [✓] 28 项远程隔离回归通过,含真实独立 Nginx 换证、重载、回退后的 TLS 指纹检查和原子配置权限回归;候选文件与远程测试文件摘要一致。
- [✓] 线上平滑重载期间两个站点 58 次 HTTPS 探测成功,已有连接完整下载 312,377 字节,Nginx 与 Smail 主进程未重启;七个 TLS/STARTTLS 入口复测通过。
- [✓] DNS 候选脚本在真实未到期状态校验通过,但没有签发新证书或替换自动任务。
- [✓] 00:34 恢复迁移中被 umask 收紧的 Smail 配置权限为原 0644,内容摘要不变;远程语法检查、八个保护文件及七个 TLS/STARTTLS 入口收尾复核通过,未重启服务。
- [!] Smail 专用 DNS 授权、全新 DNS 挑战、正式新证书发布、外部告警尚未验收;线上续期脚本和定时任务仍为旧版本,不能宣称无停机自动续期已启用。
- [!] 实时配置显示 Scert 已按域名共享 443,旧记录中的 8003/8004 不再是当前入口。其他生产门槛继续有效,整体结论仍为“不满足生产放行”。
本轮无业务数据写入,不清库、不重编译应用、不替代首次安装和浏览器业务验收。详情及失败记录见《无停机续期整改记录》。
### 历史状态:2026 年 9 月 17 日晚间复测
本节与《晚间验收复测记录》保留当时状态;当前以顶部较新章节为准,不应把早期 SSH 失败、自签名或单次资源失败当作当前结论。已部署程序仍为 `review-2263779`,本轮没有编译或替换应用。
- [✓] SSH 可用;8001/8002 与 Nginx 反代、正式可信证书、七个 TLS/STARTTLS 入口复测通过。
- [✓] 六项远程隔离续期回归通过;备份摘要、证书有效期与关键文件权限复核通过。
- [✓] 原 128 MiB 保留预算的资源预检五分钟共 11 次采样通过,同一进程、无 OOM;不代表持续负载或生产容量验收,PROD-013 整体仍待完成。
- [✓] 用户授权测试维护窗口后,128 MiB 限额内真实测试环境续期及 systemd 超时自动恢复通过,Smail 与 Scert 网页入口均恢复。详见《续期维护窗口演练记录》。
- [!] Nginx 仍同时承载 Scert 8003/8004;全新挑战、正式换证、外部告警及长期共用维护窗口尚未完成验收或确认,不能把单次测试停机授权扩大为长期运维批准。
- [!] 代理客户端 IP、公网恢复端口、远程浏览器业务闭环、管理员恢复撤销、凭据轮换、故障恢复、续期告警、容量与异机恢复仍待验收。
结论:维持“不满足整体生产放行”。本轮为无业务写入的部署复测,不冒充清库、最新构建或浏览器首次安装验收。
### 历史复核:2026 年 9 月 17 日 22:02 主机清理
本节更新下方 21:51 的资源失败状态。经用户授权清理 47 主机,发现 `/tmp` 为 tmpfs,旧发布及验收文件实际占用物理内存。6 项无进程引用的 Smail、Scert 临时发布文件已完整归档到磁盘,并保留原路径链接;业务数据、证书、已有备份和服务配置未改动。
- [✓] 释放约 355.5 MiB 文件内容占用,逐文件 SHA-256、属主、权限和修改时间一致;四项业务服务 PID、重启计数未变。
- [✓] 原参数资源预检连续 5 次通过,间隔 15 秒;保留 128 MiB 系统预算,未降低 512 MiB 硬上限或 384 MiB 高水位。可用内存约 625 至 643 MiB,未出现 OOM。
- [~] PROD-013 从“即时预算失败”转为“短时预检通过,持续运行、同机增长与容量待验收”。采样中最小剩余增长预算约 159 MiB,仅比 128 MiB 门槛多约 31 MiB,不构成宽裕容量证明。
- [!] 自签名证书、完整远程浏览器流程、恢复撤销、异机恢复等其他阻塞保持不变,仍不能签署生产放行。
归档及完整清单:`/var/backups/host-tmp-archive-20260917T215952/manifest.json`;五次原始预检:同目录 `resource-samples.json`。未来构建或测试产物应放在磁盘上的项目专用 `/var/tmp` 目录,避免大包再次占用 tmpfs;未改全局临时目录或删除失败测试证据。
### 历史复核:2026 年 9 月 17 日 21:51
本节优先于下方早期状态。已使用本次提供的访问凭据恢复受信任主机密钥校验的 SSH 连接,不再将 SSH 认证列为当前阻塞。凭据轮换、历史清理和访问审计仍未完成。
- [✓] 线上双程序摘要与 `review-2263779` 封存候选一致。
- [✓] 新增资源策略 15 项 Python 回归和 Node 测试入口在远程受限单元通过,无跳过。
- [✓] 最新程序在全新隔离副本通过正式初始化 API、HTTPS 登录会话、三协议授权码、内部 25 端口中文正文及附件入库、三轮混合认证过载恢复;双库完整性正常,无新增 OOM。
- [✓] 停服备份后新增 systemd drop-in,运行进程确认 `GOMEMLIMIT=256MiB`;未修改原环境文件,未改变 384/512 MiB 内存限额。
- [!] PROD-013:资源预检仍失败。21:51 可用内存约 312 MiB,服务增长至硬上限还需约 495 MiB,无法同时保留 128 MiB 系统预算。不能将小样本的约 84.1 MiB 峰值直接作为生产容量。
- [!] PROD-006:当前证书为自签名,系统信任校验失败。
- [ ] PROD-007、PROD-008、PROD-012:正式浏览器、网页持久投递闭环、完整本地 IPC 恢复撤销与浏览器首次安装未通过。服务器未检测到 Chromium/Chrome;没有改为本机测试或忽略证书错误。
- [ ] 异机恢复、持续监控、生产容量及故障注入验收仍待完成。
结论:候选可继续隔离验收,不满足生产放行。线上数据库未清空;空数据副本用于本轮协议测试,不冒充线上清库或浏览器六步安装验收。详细证据见《远程服务器测试记录》最新章节。
本清单对应 2026 年 9 月 17 日 `D:\Desktop\Smail` 生产审查整改,验收服务器为 `47.108.78.12`。应用和自动测试只在该服务器执行,SMTP 按用户要求使用远程 `127.0.0.1:25`,不将公网 25 端口连通列为本轮通过条件。
当前版本已经完成凭据配置、SMTP 判定、MX 路由和网页持久投递队列的代码整改及针对性远程测试,但仍不建议直接生产上线。测试范围、版本摘要和备份位置以《远程服务器测试记录》最新章节为准。
截至 11:32,47 服务器已部署 `review-421aa7303d3b`。本轮 60 包分批执行、958 个顶层用例通过;部署后内部 SMTP 五项真实入库、双库完整性及未认证接口边界通过。此结论不覆盖跳过项、容量、可信 TLS 或真实网页登录发信;部署和 SMTP 回归均保留数据,不满足 PROD-012 的清库安装要求。
12:39 已部署认证容量与前端重试版本 `review-d34ffdb7d1f6`。前端 23 个文件、182 项测试通过,旧版 958 项结果不得作为新版全量通过的依据。随后空数据副本通过正式初始化接口、HTTPS 登录、三协议授权码登录及中文附件收信,但真实 POP3 过载响应失败,不能将此前业务层测试等同于完整协议验收。
13:05,POP3 与 SMTP 错误分类修复的三包远程回归共 48 项通过,无跳过。13:10 同版候选程序通过空数据副本初始化、真实协议及三轮混合认证过载恢复;随后完成备份部署,线上为 `review-b47f36643547`。13:12 部署后内部 SMTP 五项真实收信、产物摘要、双库和安全边界复核通过。生产容量、资源规划和正式浏览器验收仍未通过。
15:21 起继续资源隔离整改。已补充 systemd 候选资源预算、OOM 整组收尾、启动限频、90 秒停止期限、只读资源预检及反例测试;本轮仅完成源码复审、语法检查和 Linux 测试程序交叉编译,未在本机执行应用或测试用例。当前会话无法通过 47 的 SSH 认证,没有上传或部署,也没有重新核实线上版本与资源。详见《生产资源部署说明》,不得把本轮源码变化计为 PROD-013 已通过。
## 任务状态
| 编号 | 优先级 | 任务 | 状态 | 验收边界 |
| --- | --- | --- | --- | --- |
| PROD-001 | P0 | 移除脚本中的已知明文凭据 | [x] | 工作区已清理,历史泄露处置未结束 |
| PROD-002 | P0 | 轮换泄露凭据、核查访问记录 | [!] | 前轮记录旧 SSH 密码仍有效;本轮不复用泄露密码,已有密钥无法登录,需要恢复受信任访问并确认轮换状态 |
| PROD-003 | P0 | 处置 Git 历史中的凭据 | [!] | 未授权重写历史或强推;轮换应先于历史清理 |
| PROD-004 | P0 | 持久化逐收件人投递、防不确定重投 | [x] | 相关自动测试通过,真实网页业务闭环待验收 |
| PROD-005 | P1 | MX、备用路由、DNS 错误分类 | [✓] | 针对性测试通过,不代表各外部邮件供应商兼容性 |
| PROD-006 | P0 | 可信 TLS 和正式域名验证 | [✓] | 2026-09-17 已签发并部署五域名可信证书,443/8002/465/993/995 与内部25/587系统信任链校验通过;续期告警和到期演练另列 |
| PROD-007 | P0 | 完整网页登录、发信和状态核对 | [!] | 可信证书已解决,仍需有效测试账号和远程真实浏览器;不得绕过登录 |
| PROD-008 | P0 | 超级管理员恢复完整交互 | [!] | IPC 权限已复核,正式密码代理交互及旧会话撤销未验收 |
| PROD-009 | P1 | 备份与恢复演练 | [x] | 同机独立网络和挂载空间恢复、HTTPS、内部 SMTP 入库通过;异机恢复未演练 |
| PROD-010 | P1 | 内部 SMTP 与部署后安全回归 | [✓] | 五项真实收信、双库、产物、未认证 API 均通过 |
| PROD-011 | P1 | 全量测试、竞态、数据库兼容性和压测 | [~] | 60 包分批执行、958 个顶层用例通过;8 处跳过单列,竞态、真实跨库和容量验收未完成 |
| PROD-012 | P1 | 最新版本清库首次安装验收 | [~] | 新部署产物的空数据副本正式初始化 API、协议收信和认证过载恢复通过;真实浏览器首次安装待验收 |
| PROD-013 | P0 | 共享主机资源隔离与容量 | [!] | 首轮全机 OOM 后补充候选服务限额和只读预检;SSH 认证阻塞,尚未部署或测试,实际预算与容量未验收 |
| PROD-014 | P1 | 投递结果写库恢复 | [✓] | 12 项远程测试及源码复审通过;持久故障后的进程退出仍需人工核对,不代表生产故障演练通过 |
| PROD-015 | P1 | 跨平台证书路径与插件测试 | [✓] | Linux 拒绝异平台路径误解析;保持证书校验、托管导入和插件目录权限要求 |
| PROD-016 | P0 | 密码计算全局并发和过载处理 | [✓] | 48 项远程回归及新部署产物三轮真实混合认证过载恢复通过;区分 SMTP 535/454、IMAP UNAVAILABLE、POP3 SYS/TEMP,不代表生产容量或浏览器验收通过 |
状态含义:`[ ]` 未开始,`[~]` 进行中,`[x]` 已完成待复审,`[✓]` 指定范围复审通过,`[!]` 暂缓或存在阻塞。
## 晚间候选进展
- [x] 修正发行工具链版本来源,补充双程序大小和 SHA-256 回执;代码已推送至 `2263779`,新增断言待远程执行。
- [x] 完整构建并单独封存 `review-2263779` Linux/amd64 候选包;目标平台、ELF 文件头、提交号、源码指纹和产物摘要已静态核对,尚未部署。
- [!] 20:14 再次连接 47 服务器仍认证失败,未执行清库、部署或应用测试;资源策略和其余生产门槛继续阻塞。
- [ ] 打包流程自动拒绝错误目标产物、隔离旧目录元数据;本轮以全新封存目录和明确文件清单规避混包,尚未形成自动回归保障。
候选压缩包与边界详见《远程服务器测试记录》晚间章节。既有远程通过项仅对应记录中的历史版本,不代表 `review-2263779` 已通过同样验收。
## 凭据与 SSH
SSH 脚本复用 `test/tools/remote_ssh.py`,强制核对已知主机密钥。不得为连接方便改回自动接受未知主机,也不要把真实值写入命令记录、仓库或文档。
| 环境变量 | 用途 |
| --- | --- |
| `SMAIL_SSH_HOST`、`SMAIL_SSH_PORT` | SSH 主机和端口 |
| `SMAIL_SSH_USER` | 登录账号 |
| `SMAIL_SSH_PASSWORD` | 临时注入的密码,优先协调迁移到密钥认证 |
| `SMAIL_SSH_KEY` | 私钥路径,不是私钥内容 |
| `SMAIL_SSH_KNOWN_HOSTS` | 额外的已核验主机密钥文件路径 |
| `SMAIL_TEST_ADMIN_PASSWORD` | 测试安装时使用的管理员密码 |
| `SMAIL_TEST_SMTP_PASSWORD` | SMTP 示例客户端凭据 |
轮换前必须验证新的独立登录路径,避免锁死服务器访问;还应撤销关联会话、令牌及重复使用该密码的账号凭据,并审查异常登录。历史清理需要单独授权、备份及协作安排,当前未删除文件、重写历史或强推。删除源码中的密码不会让旧密码失效。
## 投递语义与运维边界
- 网页返回提交成功表示邮件和任务已经持久化,不表示收件箱已收到。SMTP 250 仅表示对端接收了投递责任。
- 每收件人独立记录 `queued`、`running`、`accepted`、`failed` 或 `uncertain`。成功收件人不随其他收件人的失败重投。
- 临时失败最多五次,间隔 1、2、4、8 分钟;明确拒绝、证书问题、危险目标和结果不确定停止自动重试。
- DATA 结果不确定、重启时仍在途、旧版本没有可靠尝试记录的邮件必须先核对实际收件结果,再决定人工处理。当前没有已验收的人工重投界面,不要直接改库重排。
- 新版数据库读取失败不领取任务;结果写库失败时单工作器最多保留一份结果,暂停新领取,每秒仅重试写库,不再次调用 SMTP。数据库恢复后自动保存;进程中途退出仍将遗留在途记录转为待核对。相同尝试的相同结果允许重复保存,不覆盖后续尝试;线上部署状态以最新测试记录为准。
- 当前仅允许单实例、单工作器使用同一队列库。没有验收多实例调度、吞吐容量、队列告警和故障期间的服务等级。
- 现有邮件客户端 SMTP 提交、系统通知和其他调用方不自动等同于网页持久队列;分别验收其投递及失败处理。
- 备用 MX 保留既有 25 STARTTLS、587 STARTTLS、465 TLS 顺序;禁止明文降级。各运营商的端口策略及可达性需要独立验证。
## 下一轮验收顺序
1. 验证替代 SSH 登录,完成泄露凭据轮换和访问审计,再另行协调历史清理。
2. 部署覆盖实际域名的受信任证书,使用有效测试账号恢复桌面浏览器验收;移动端遵循指定插件流程。
3. 从正常网页提交邮件,核对持久任务、部分成功、最终状态和实际收件结果;对重启、暂时拒绝、DATA 断连及数据库故障使用受控远程故障环境,不影响其他服务。
4. 用受保护的本地管理命令完成恢复交互,核对新密码登录、旧密码拒绝、旧会话及客户端凭据撤销。不得增加普通 HTTP 或公网/LAN TCP 恢复入口。
5. 在隔离远程目标完成备份恢复、全量与竞态测试、目标数据库兼容性和容量验证。最新版本重新清库安装前,先备份所有项目数据库并核实范围,不清理其他项目数据。
上述阻塞项解决后再做最终生产评审,不以构建成功、首页 200、内部 SMTP 250 或单次提交代替整体验收。
## 2026-09-17 23:00 反代验收更新
- [✓] Smail HTTP 8001、HTTPS 8002 已生效,Nginx 接管公网 80/443,现有 UFW 拒绝外部直连上游端口。
- [✓] 五域名可信证书签发和七个 TLS/STARTTLS 入口检查通过;私钥仅在服务器受保护目录,未进入仓库。
- [✓] 续期未到期任务、六项远程隔离回归、可信 HTTPS 首页及入口资源检查通过。
- [!] 到期续期维护窗口、外部告警、代理后的客户端 IP 限流、恢复页面外部端口仍需整改或演练。
- [~] 安装 Nginx 后原 128 MiB 保留预算的只读预检再次通过,无新增 OOM;这不是生产容量批准。
- [!] 真实浏览器首次安装与发信、管理员恢复撤销、凭据轮换和异机恢复继续待验收。
详细配置、备份、证书与证据见《Nginx反代与证书部署说明》和《远程服务器测试记录》。本轮没有业务数据写入或清库,没有把传输层检查冒充首次安装测试。
## 资源与测试隔离
47 服务器约 1.6 GiB 内存,晚间复核已有约 4 GiB 主机交换空间,Smail 的 `MemorySwapMax` 仍为零;同机另有 MySQL、Scert 等服务。首轮测试仅设置 Go 软内存上限,不能防止全机内存耗尽。新工具通过 systemd 设置 CPU、内存、进程数和最长运行时间上限,使用独立网络、私有临时目录,并禁止访问线上 `/opt/smail`、`/run/smail`。可用内存不足时拒绝开始测试,不自动放宽限制、不停止其他项目。
`GOMEMLIMIT` 是 Go 回收目标,不是进程或主机硬限制。本轮协议测试以 128 MiB cgroup 上限、25% CPU 配额和 64 MiB Go 回收目标完成,不能据此推导生产容量。生产仍需确定同机服务预算、并发认证开销、邮件大小与吞吐上限、告警和故障恢复指标。
恢复服务整包执行曾在 128 MiB 上限触发测试 cgroup OOM,改为逐顶层用例独立进程后 14 项通过,峰值约 126.4 MiB。没有降低 Argon2id 的 64 MiB 内存参数;不能把拆分测试视为生产内存问题已解决。测试启动器默认 128 MiB,并对不存在的包、空清单和零匹配筛选返回失败;中断包保留运行中记录。
后续认证整改在整个进程内仅允许一个昂贵密码计算,满载立即返回可重试错误,不建立等待队列;HTTP 返回 503,SMTP 返回 454,IMAP 和 POP3 返回临时不可用。恢复服务不会把容量不足视为错误恢复码或消耗验证机会,前端不会因此清空输入或宣称链接失效。前端测试使用同样的独立网络和生产目录访问限制,128 MiB 硬上限下峰值约 73.7 MiB;测试通过不代表已测得生产可承载并发量。