15 KiB
云端全项目测试报告
测试日期:2026-09-20,时区 Asia/Shanghai。工作区:D:\Desktop\Smail。服务器:47.108.78.12,页面:https://web.solit.cn/。
结论与任务状态
已完成全项目自动化测试、发现问题的修复、Linux 构建和云端部署,并完成核心账号安全及邮件协议实机验证。当前没有未解决的自动化测试失败,但仍有真实外部邮箱收件、客户端网络路径和无人值守续期等未通过项,不能据此宣布整个项目最终验收通过。
- [✓] 已按授权备份、清理 Smail 相关环境,重新初始化测试数据库。接续测试复用本轮数据库,没有重复清库。
- [✓] 修复测试发现的问题,相关包完成复测;最新程序已部署,云端和本地摘要一致。
- [✓] 三类账号登录、TOTP 选择、提醒行为、邮件验证码跨场景消费、密码重置和客户端凭据撤销完成相应实机验证。
- [✓] 项目部署包只包含三个程序与四个运行目录,没有加入 Python、部署或续期脚本。
- [✓] 本轮临时 TOTP、外部邮箱绑定均已停用,账号密码保持用户指定值。
- [✓] 实时 DNS 控制面、两个权威 DNS 和公共 DNS 均确认泛解析生效;邮件记录保留,DKIM 与运行密钥匹配。
- [✓] Web 及已启用邮件 TLS、STARTTLS 入口返回同一张覆盖根域名的泛域名证书。
- [!] 三个指定的 163 邮箱尚未完成真实收件和绑定验证。
- [!] 当前客户端到公网邮件端口的连接路径未通过,不能声称外网邮件客户端收发通过。
- [!] DNS 无人值守续期及 Nginx 换证同步未通过。
- [!] Windows 提权 Named Pipe、依赖外部服务的插件业务等不在本轮 Linux 实机通过范围内。
本轮修复
| 提交 | 问题与结果 |
|---|---|
c82be24 |
修复全量测试的密码容量竞态,更新与现有行为不一致的审查夹具及前端说明。 |
b062ca6 |
项目 DNS 签发同时覆盖主域名及泛域名,保留两条同名 TXT 挑战。 |
65e61a3 |
修复真实数据库迁移中对文本主键错误处理序列的问题,校正日志测试。 |
b515186 |
公网地址探测支持失败回退,限制并发请求的总等待时间。 |
7aec99d |
密码重置同步撤销旧客户端授权码,补充事务回滚及用户隔离回归。 |
e0baf27 |
未认证 POP3 的 QUIT 立即回复并关闭连接,不提交邮箱更新。 |
310ad01 |
停用的外部邮箱允许所属用户重新绑定、切换用途;清除旧验证状态并要求重新验证。停用同时失效绑定和变更挑战,保留跨用户隔离及主要邮箱数量限制。 |
每轮代码修改前均保存中文 Git 基线并推送。一次文档基线推送出现认证失败,重试后成功。没有使用宽泛暂存或提交测试凭据。
自动化测试证据
云端原始日志根目录:/var/tmp/smail-cloud-tests-20260920/。
| 范围 | 结果 | 证据 |
|---|---|---|
| Linux 后端 | 66 个包的最新有效结果无失败,1953 个 PASS 标记、0 个 FAIL 标记、5 个 SKIP 标记 | latest-summary.json、latest-packages.json |
| 前端 | 198 项通过,0 失败、0 跳过 | 本地 test-log/run-2026-09-19T17-30-34-658Z-19808/frontend.log |
| Windows 构建互斥与测试入口 | 4 项通过;Linux 专用项在 Windows 跳过 | 本地 test-log/run-2026-09-19T16-13-15-667Z-3920/deployment.log |
| Linux 资源策略 | 15 项通过 | 云端 resource-policy.log |
| 实际服务资源只读预检 | 通过,无失败项;不替代业务验收 | 云端 final-resource-check.json |
| 最后一次修改的本地受影响包 | externalemail、controllers、recovery、verification 均通过 | 本地 test-log/run-2026-09-19T19-10-20-850Z-26796/backend.log |
| 最后一次修改的 Linux 复测 | externalemail、controllers 均 EXIT=0 | 云端 rebind/externalemail.log、rebind/controllers.log |
后端统计由首轮全量测试与受影响包的最新复测合并,不是同一最新版一次执行的全量结果。PASS 标记包含父测试和子测试,不能表述为 1953 个独立案例。首轮发现的 adminreset、dbmigration、logstore 等失败已用后续有效复测替换;具体映射保存在 latest-packages.json。
五个后端跳过项:
TestProductionPluginIsolationPolicy:Windows 专用。TestSecuritySetupBrowserFixture:需要显式启用的长期浏览器夹具。TestSystemdResultPrompt:需要隔离的 systemd 人工交互。TestSystemdCancelledInputResult:同上。TestMaster:旧集成入口,需显式启用,不能直接指向运行库。
本轮另行完成真实 smail-admin 启动、安全验证、成功提示及 stop 取消操作;自动化跳过项仍按跳过记录。Windows 未提权环境未完成 Named Pipe 验收,不列为通过。
云端业务验证
账号与登录
xuans为超级管理员,testadmin为管理员,testuser为普通用户。最终均保留用户指定密码;本文不记录密码、验证码、恢复令牌或 TOTP 密钥。- 未配置安全验证的超级管理员登录后,页面强制要求至少启用一种方式。最终浏览器重新加载后可见该中文弹窗,没有跳过保护。
- 普通用户点击“我知道了”后可继续,注销并重新登录会再次提醒未完成的安全设置。
- 三类账号均具备用户可选的 TOTP 功能。普通用户实测绑定、登录和停用;密码阶段约 473 毫秒、TOTP 验证约 83 毫秒。其他两类账号本轮早期测试完成后也已停用测试 TOTP。
- 登录密码正确后,有主要外部邮箱的账号返回验证选择,
delivery_status=idle,没有自动发邮件;只有主动发送才进入sending。
邮件验证码与公开密码恢复
使用普通测试用户的真实站内收件箱临时验证管理员,邮件经项目正常投递与邮件 API 读取,没有改数据库伪造验证结果。此闭环证明应用链路,不替代 163 外部收件验收。
| 步骤 | 最后一次实测耗时 | 结果 |
|---|---|---|
| 停用邮箱重新绑定为主要邮箱 | 3190 毫秒 | 成功,仍须邮件验证 |
| 确认重新绑定 | 84 毫秒 | 成功 |
| 管理员密码阶段 | 341 毫秒 | 返回 email 选择,邮件 idle |
| 主动发送登录验证码 | 71 毫秒 | 返回 sending,后台完成真实投递 |
| 邮件码完成登录 | 103 毫秒 | 成功 |
| 立即发起公开恢复 | 143 毫秒 | 识别管理员及 email 方式 |
| 紧接着发送恢复邮件 | 2628 毫秒 | 成功,没有被登录验证码冷却阻塞 |
| 邮件码验证恢复身份 | 74 毫秒 | 发放一次性重置凭证 |
| 设置密码 | 307 毫秒 | 重置成功 |
| 重置后密码登录 | 365 毫秒 | 成功进入验证选择 |
| 再次主动发送登录码 | 89 毫秒 | 成功 |
以上为当次单请求观测,不是负载压测或全网延迟保证。公开恢复请求未携带登录 Cookie 或 CSRF 头。测试完成后通过正式接口停用临时邮箱;管理员再次直接登录约 430 毫秒,超级管理员约 307 毫秒。
邮件协议与重置撤销
- 服务器本机经域名校验的 TLS 完成 SMTP 投递、IMAP 查询读取和 POP3 收取,数据库收件归属核对正常。证据:
protocol-acceptance.json。 - 真实密码重置后,旧客户端授权码在 SMTP、IMAP、POP3 均被拒绝。证据:
revoke/live-revocation.json。 - 未认证、输入 USER 后及错误密码后的 POP3 QUIT 均立即回应并关闭连接;相关包回归通过。证据:
revoke/live-pop3-quit.json。 - 超级管理员登录页恢复通道保持拒绝;本机重置使用受保护 Unix Domain Socket。最终
/run/smail/admin-control.sock权限为0600,所属用户/组为smail,未增加公网重置 TCP 监听。 - smail-admin 仅显式 start 进入交互,stop 取消;restart、reload 及变体不能开启新的重置交互。systemd 的 restart 仍可能先停止原交互,这一系统行为边界详见《管理员重置命令限制验收》。
证书与网络限制
真实证书签发者为 Let's Encrypt YR1,SAN 为 solit.cn 和 *.solit.cn,有效期从 2026-09-19 16:44:26 UTC 至 2026-12-18 16:44:25 UTC。服务器通过回环和公网地址连接 443、465、993、995,使用实际域名 SNI、系统 CA 进行校验,均通过 TLS 1.3。浏览器 HTTPS 页面可访问。
本机系统 DNS 将三个邮件子域名解析到 198.18.2.x;本机 Python 不论域名连接还是强制公网 IP,连 443 也发生 TLS EOF。现有证据只能说明客户端网络路径未通过,不能归因为云端证书错误,也不能声称公网邮件客户端收发正常。本轮没有修改本机网络设置。
Google 公共 DNS 已查到 DKIM;对 1.1.1.1 的 UDP 查询超时,未计为通过。本轮 ACME TXT 清理仅针对新建的两个记录 ID,核对剩余为零,既有记录保留。
03:32—03:44 补充实测
以下为接续时重新采集的实时证据,不依赖测试参数或历史快照判定通过。云端证据位于 /var/tmp/smail-cloud-tests-20260920/;本地副本位于忽略目录 test-log/cloud-audit-20260920/。
| 核验项 | 结果 | 证据 |
|---|---|---|
| DNS 控制面 | 阿里云当前返回 16 条记录,* A 47.108.78.12 已启用 |
本地 test-log/cloud-dns-current-20260920.json |
| 权威及公共解析 | dns13.hichina.com、dns14.hichina.com、8.8.8.8 共 33 次查询均返回 NOERROR;随机一级子域名、Web 和邮件服务地址均指向服务器 |
live-dns-audit.json |
| 邮件记录保留 | MX、SPF、DKIM、DMARC 均可查到;与清理前快照相比,没有删除原有记录,只新增泛解析并更新 Smail 的 default._domainkey 公钥 |
同上及本地清理前快照 |
| DKIM 密钥匹配 | 三个 DNS 查询源中的公钥均与 /opt/smail/ssl/dkim/dkim.priv 推导出的公钥一致;只比较公开材料,不输出私钥 |
live-dkim-match.json |
| 运行域名 | 邮件主域名为 solit.cn,后台为 web.solit.cn,公开 HTTPS 端口为 443;域名来自部署配置 |
live-domain-configuration.json |
| 统一证书 | 回环 443、8002、465、993、995,以及服务器经公网 IP 访问 443、465、993、995,全部通过系统信任链校验且指纹一致;443、8002 额外使用根域名 SNI 校验通过 | live-certificate-unification.json |
| STARTTLS 证书 | 回环 SMTP 25/587、POP3 110 升级为 TLS 1.3,证书指纹与上述入口一致 | live-starttls-certificates.json |
| 浏览器状态 | 实际 HTTPS 页面为安全上下文,/api/ping 两次返回 200,约 314 和 164 毫秒,超级管理员强制安全设置弹窗可见 |
本地 live-browser-check.json 保存最后一次结果 |
统一证书 DER SHA-256:f369937771b4b3bd4fc1ea624a8eed30e1451c8bcefdcd1c9c15043a33113018。
DKIM 公钥 DER SHA-256:df9958f7e8c20c7d7f8735bb062f7bd7485bbee3bbd254930d7ae8d68ae6731c。
上述 TLS 连接共 14 次,其中服务器经公网 IP 访问内部 8002 的两次连接超时,不列为通过;回环 8002 校验通过,公开后台仍从 443 访问。本轮没有开放内部端口。IMAP 当前使用 993 隐式 TLS,源码和现行默认端口策略一致;143 未启用,连接被拒绝,没有将其计为 STARTTLS 通过。
本机系统 DNS 此次将 Web 解析到 198.18.1.254,邮件地址仍解析到 198.18.2.x。本机 curl 和经本地 HTTP 代理的 Python TLS 连接仍在握手阶段失败;浏览器 HTTPS 正常。没有因此修改系统 DNS、代理或防火墙,也没有将服务器自身访问公网 IP 等同于外部客户端验收。
另发现既有 aliyun-cn-hangzhou._domainkey 同名 TXT 有两条,其中一条公钥明显截断。该记录属于既有阿里云邮件链路,本轮未删除或修改;Smail 的 default 选择器公钥匹配已单独通过。保留 DNS 记录不代表既有阿里云邮件链路也已验收。
仍未通过的项目
项目托管启用内置续期检查,手动及代理托管不触发 ACME,策略测试已通过。但 DNS 挑战当前仍依赖人工 TXT,Nginx 配置也固定引用具体证书文件,没有自动同步换证引用和重载。无人值守续期仍未完成。服务器没有启用 Smail、Certbot 或 ACME 外部续期 timer,本轮没有新增外部部署或续期脚本。
指定的三个 163 地址尚未完成真实收件及绑定验证,本轮没有向这些外部收件箱发送测试邮件。后续需由各邮箱持有人接收真实验证码,再通过正式绑定流程完成验证。
最新交付与运行状态
源码提交:310ad0136e9794ccb67e2c92aec05e8c66f151ad。运行版本:test-25fa5dcf9844。后续仅文档提交,不改变部署程序。
发布包:out/release/Smail_linux_amd64.tar.gz。文件结构:
smail/
├── smail
├── smail-admin
├── smail-config
├── config/
├── data/
├── log/
└── ssl/
| 文件 | SHA-256 |
|---|---|
| 发布包 | 998a4a13514d0d2b5ef4a2708e1f27790b673af03fa390aa4f527e4f2e4da858 |
| smail | ca525d4fe98973fea2cfb496b37b714fb3aad27999bf73f674bfa27f1358c98e |
| smail-admin | 4af8a7c872d75fa48a967377e404815b0f4f7346c8c209cebb880ecb6039966f |
| smail-config | 95372303efd7b16e54c21bc6190f13da7cbcd05faeeeaab12386ece555484bb4 |
本地构建收据:out/release-receipts/Smail_linux_amd64.json。三个云端文件均与收据一致。前端和内置插件构建完成;编辑器分块大于 500 KB 的既有构建提示仍存在,没有构建失败。
03:15:29 完成最后一次人工安装和启动。Smail PID 为 712357,自动重启次数为 0,Nginx active。HTTPS 返回 200,系统证书验证结果为 0,观测约 60 毫秒。最终两个数据库 integrity_check 均为 ok;启用的 TOTP 数量为 0,未停用的外部邮箱绑定数量为 0。最后一次启动后的 systemd warning 级日志查询无记录。
最后一次部署前备份:/var/backups/smail-full-test-20260920/pre-rebind/,含三个旧程序及配置、数据、证书归档。测试日志和测试二进制保留在 /var/tmp/smail-cloud-tests-20260920/,不属于运行依赖;没有擅自删除这些验收证据。FDM、Scert、Nginx、MySQL 和 PostgreSQL 的其他业务未因最后一次 Smail 更新而停启。
03:40 接续复核时,Smail 仍为 PID 712357,自动重启次数为 0,Smail/Nginx 均 active;从最后一次启动至此的 warning 级 systemd 日志无记录。本机重置 socket 仍为 0600 smail:smail。接续只补充实测与文档,没有重新清库或变更运行程序。
公网恢复入口已通过正式配置流程设置 http.publicHttpsPort=443;/public-password-recovery 跳转到 https://web.solit.cn/rest/,不再暴露内部 8002 端口,恢复页面返回 200。