# 注册与 SMTP

注册邮箱验证默认关闭，与开放邮箱账号注册、注册码要求分开配置。未启用验证时，注册不需要发送或填写验证码，邮箱保存为未验证。用户登录后可在「个人资料 → 头像与邮箱」验证当前登录邮箱；密码找回、更换邮箱也要求验证邮箱。

全新数据库首个成功注册账号自动获得 user 和 admin 角色。判断、创建账号、角色授权和注册码核销在同一事务内完成；并发注册只有一个首任管理员，失败事务不会占用首任资格。已有账号不会因升级自动提权，已有站点可用 grant-admin 命令补授指定账号。

管理员在系统设置的 SMTP 发信服务中填写已有服务商的主机、端口、发件邮箱、账号和密码或授权码。支持 STARTTLS 与隐式 TLS，均验证服务商证书。无需部署邮箱服务器。配置加密保存、密码不回显；主机和账号不变时，密码留空保留原值。更换主机或账号需要重新填写密码，避免把旧凭据发送给新主机。配置保存后即时生效，不再读取旧 SMTP 环境变量，不默认连接 Mailpit。

未配置 SMTP 时不能开启注册邮箱验证。保存配置只检查字段完整性，不代表服务商已接受凭据或实际邮件已送达。

升级先执行 `./scripts/run-local.ps1 -Mode migrate`，应用 006 迁移，再按 本机启动说明（仓库文件：local-running.md） 执行 `./scripts/run-local.ps1 -Mode api`，前端运行 `npm run dev`。

## 本机验证

2026-09-09 已检查现有容器状态和端口映射，使用 Postgres18 与 RedisPwd。Go 测试在本机运行，使用 PostgreSQL 随机隔离 schema 和 Redis 唯一测试 key；测试完成已清理，未修改业务表或容器。

- 从忽略文件中的连接信息设置 TEST_DATABASE_URL、TEST_REDIS_URL 后，运行 `./scripts/run-local.ps1 -Mode test`：Go 测试、go vet 通过。
- 新增 TestRegistrationIntegration：验证默认免验证码、4 个并发注册仅一个管理员、未验证标志、登录后验证当前邮箱、无 SMTP 不能启用验证、SMTP 权限和密码保密、留空保留密码、验证码消费及重放拒绝、关闭注册。
- `./scripts/run-local.ps1 -Mode build`：后端构建通过。
- web 目录执行 `npm run typecheck`、`npm run build`：通过。

未执行真实服务商 SMTP 认证和公网投递测试，未执行依赖旧 Mailpit 的历史 Compose 测试。最终业务数据库迁移及运行进程重启由当前本机启动任务统一处理。
