Files
qing 30e064996c docs: 整理文档——分析类归位 reports/、补 captcha2/smtp3 README、修复全部失效链接
- profile/evaluation/promo_pack 移入 docs/reports/(按文档管理约定),内部引用同步
- 补建 captcha2/README.md、smtp3/README.md(主 README 曾引用但缺失)
- 重写 README 测试章节(实际为 tests/blackbox/,纯标准库零依赖)
- 清除全部 docs/INDEX.md 残留引用;legacy README 中已删除 ini 的失效链接改文字
- 全仓库链接检查 0 broken
2026-08-10 12:45:26 +00:00
..

smtp3 — C++20 邮箱验证码服务

smtp 的 C++20 重实现,接口与 Python 版完全兼容(pymsg 路由 send_email/verify_email/health),修复审计发现的安全项(弱随机、日志明文验证码、now 遮蔽等)。基于 libmsg + boost::json + OpenSSL。

架构

ca :8443 (注册流程经 pymsg 调用)
   │  pymsg TCP
   ▼
smtp3 :8008 (RpcServer)
   │  SMTP_SSL (OpenSSL)
   ▼
外部 SMTP 服务器 (163/QQ 等)
  • 服务框架: libmsg RpcServer(pymsg 协议,4B 大端长度前缀 + UTF-8 JSON)
  • SMTP 会话: 直接控制 OpenSSL 会话发送,更精细的超时/错误处理
  • 安全: std::random_device 安全随机、常数时间比较、日志脱敏、冷却/限流/熔断
  • 异步日志: libmsg AsyncQueue → db2 Logs 表

接口

pymsg 路由 说明
send_email 生成 6 位验证码并经 SMTP_SSL 发送,10 分钟有效;同一邮箱 60s 冷却,发送失败不计入冷却
verify_email 校验,通过即一次性消费防重放;连续失败 5 次自动作废并返回 invalidated
health 健康检查

请求/响应 JSON 格式与 Python smtp 完全一致,ca 零改动。

配置

纯 CLI + 环境变量 + 默认值,不依赖 confs。

配置项 CLI 参数 默认值
绑定地址 --addr / -a 127.0.0.1
监听端口 --port / -p 8008
SMTP 服务器端口 --smtp-port 465(SSL)
验证码长度 --code-len 6(4~10)
验证码有效期 --code-ttl 600s
发送冷却 --send-interval 60s
最大校验失败次数 --max-verify-attempts 5
单邮箱限流 --email-hourly-limit / --email-daily-limit 3 / 10
全局熔断 --smtp-hourly-limit 100
邮件标题/正文上限 --max-subject-len / --max-content-len 256 / 4096
实例名 / 日志级别 --instance / --log-level smtp / info

SMTP 账号凭据经 .env 注入(SMTP_SERVER / SMTP_USER / __PASSWORD)。优先级: CLI > 环境变量 > 默认值。

构建与运行

./_set.sh    # 编译
./_run.sh    # 运行

依赖: libmsg, boost::json, OpenSSL(libssl-dev)

状态

许可证

MIT License