EmailSender 邮件发送
C++ 后端服务器框架EmailSender 邮件发送
CHAPTER 07

EmailSender 邮件发送

2 分钟阅读 · 382 字

对应文件:

  • 接口:include/EmailSender.h
  • 实现:src/EmailSender.cpp

1. 模块定位

EmailSender 是简化 SMTP 客户端,支持:

  • SMTP 配置初始化
  • 单收件人/多收件人发送
  • AUTH LOGIN 认证
  • 纯文本邮件正文

2. 主要接口

  • getInstance()
  • init(smtpHost, smtpPort, username, password)
  • sendMail(from, to, subject, body)
  • sendMail(from, toList, subject, body)
  • getLastError()

内部核心函数:

  • sendMailImpl(...)
  • smtpConnect(...)
  • smtpCommand(...)
  • smtpCommandRecv(...)
  • base64Encode(...)

3. SMTP 发送流程(实现级)

sendMailImpl 中的状态机如下:

  1. 建连 smtpConnect
  2. 接收服务器问候码,要求 220
  3. 发送 EHLO localhost(失败回退 HELO localhost)
  4. 发送 AUTH LOGIN,要求 334
  5. Base64 用户名 -> 期望 334
  6. Base64 密码 -> 期望 235
  7. MAIL FROM:<...> -> 250
  8. 对每个收件人 RCPT TO:<...> -> 250
  9. DATA -> 354
  10. 发送 RFC822 风格头和正文,以 \r\n.\r\n 结束
  11. 期望响应 250
  12. QUIT -> 221(返回值不强依赖)

4. 跨平台实现点

  • Windows:
    • Winsock 初始化 WSAStartup
    • 关闭 socket 用 closesocket
  • Linux:
    • POSIX socket API
    • close

5. 线程安全

  • 对外 sendMail 使用 std::lock_guard<std::mutex> 保护
  • 避免并发请求同时复用内部状态(lastError_、配置字段)

6. 当前能力边界

  • 支持 AUTH LOGIN 的明文 SMTP 通道
  • 不包含 TLS/STARTTLS
  • 不支持附件、HTML 正文、CC/BCC、MIME 多部件
  • 对多行 SMTP 响应解析较简化

7. 风险与改进建议

  • 安全性:
    • 建议增加 SMTPS(465)或 STARTTLS(587)
    • 避免在无 TLS 情况下传输凭据
  • 协议完备性:
    • 完善多行响应处理和状态码检查
    • 增加超时控制与重试策略
  • 功能增强:
    • 附件、HTML、模板邮件
    • 异步队列发送 + 失败重投
全部章节