feat(server): 接入 QQ 邮箱 SMTP 发送登录验证码
Build and Publish Server / build (push) Successful in 2m6s

- 支持 465 隐式 TLS 与 587 STARTTLS,SMTP 配置优先、Postmark 备用
- 发件人支持 QQ 域名邮箱地址(z@kepo.net),凭证仅走环境变量
- HTTP 测试覆盖发送成功与认证失败;真实发信测试需显式开启 RUN_QQ_SMTP_LIVE_TEST

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
gouki
2026-09-27 23:24:46 +00:00
co-authored by Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
parent deb32f8fab
commit c161d42b06
8 changed files with 515 additions and 16 deletions
+13 -5
View File
@@ -5,7 +5,7 @@
## 功能模块
- 微信小程序登录与生辰档案。
- Postmark 邮箱验证码登录。
- QQ 邮箱 SMTP 验证码登录,支持 465 隐式 TLS 或 587 STARTTLS;Postmark 可选备用。
- Stripe `4.99 USD` 报告支付。
- Binance Pay `5 USDT` 报告支付。
- 签名 Webhook、幂等事件、退款权益撤销。
@@ -35,7 +35,7 @@ go run ./cmd
go test ./...
```
测试环境文件为本地 `server/.env.test`,不提交任何真实密钥。
本地测试配置使用 `server/.env.test`。如果文件包含 SMTP 凭证,必须保持 Git 忽略并限制文件权限,绝不提交到仓库。真实发信测试需显式运行 `RUN_QQ_SMTP_LIVE_TEST=1 SMTP_TEST_TO=收件地址 go test ./internal/handler -run '^TestRequestEmailLoginCodeLiveQQSMTP$' -count=1`;该命令会实际发送邮件。
## 商业支付 API
@@ -88,14 +88,22 @@ mysql < migrations/002_commerce.sql
## 环境变量
完整模板见 `.env.example`。生产环境至少需要:
完整模板见 `.env.example`。邮箱登录配置 QQ SMTP:
- `SMTP_HOST=smtp.qq.com`
- `SMTP_PORT=465`(或 587)
- `SMTP_USERNAME`:完整 QQ 邮箱地址
- `SMTP_PASSWORD`:QQ 邮箱生成的 SMTP 授权码,不是邮箱登录密码
- `SMTP_FROM_EMAIL`:发件地址。生产使用 `z@kepo.net`(`kepo.net` 已通过 QQ 域名邮箱绑定,MX 为 `mxdomain.qq.com`);需在 DNS 添加 SPF 记录 `v=spf1 include:spf.mail.qq.com ~all`,否则 Gmail 等可能拒收或判为垃圾邮件
- `SMTP_TLS_MODE=implicit`(465)或 `starttls`(587)
- `SMTP_TLS_CA_FILE`:可选的自定义 CA 文件路径
QQ 邮箱需先在账户设置中开启 SMTP 服务。SMTP 配置有效时优先使用 SMTP;未配置时才尝试 Postmark。生产环境还需要:
- `JWT_SECRET`
- `ADMIN_PASSWORD`
- `PUBLIC_BASE_URL`
- `WEB_APP_URL`
- `POSTMARK_SERVER_TOKEN`
- `POSTMARK_FROM_EMAIL`
- `STRIPE_SECRET_KEY`
- `STRIPE_WEBHOOK_SECRET`
- `BINANCE_PAY_API_KEY`