CHAPTER 07
EmailSender 邮件发送
对应文件:
- 接口:
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 中的状态机如下:
- 建连
smtpConnect - 接收服务器问候码,要求
220 - 发送
EHLO localhost(失败回退HELO localhost) - 发送
AUTH LOGIN,要求334 - Base64 用户名 -> 期望
334 - Base64 密码 -> 期望
235 MAIL FROM:<...>->250- 对每个收件人
RCPT TO:<...>->250 DATA->354- 发送 RFC822 风格头和正文,以
\r\n.\r\n结束 - 期望响应
250 QUIT->221(返回值不强依赖)
4. 跨平台实现点
- Windows:
- Winsock 初始化
WSAStartup - 关闭 socket 用
closesocket
- Winsock 初始化
- 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、模板邮件
- 异步队列发送 + 失败重投