132 lines
3.3 KiB
Markdown
132 lines
3.3 KiB
Markdown
# SMTP 邮件发送优化说明
|
|||
|
|
|
||
|
|
## 主要优化内容
|
||
|
|
|
||
|
|
### 1. 安全性优化
|
||
|
|
- **敏感信息保护**: 日志输出时过滤密码等敏感信息
|
||
|
|
- **TLS安全配置**: 强制使用TLS 1.2+,配置安全的加密套件
|
||
|
|
- **输入验证**: 严格验证配置参数和邮件内容
|
||
|
|
|
||
|
|
### 2. 功能完善
|
||
|
|
- **STARTTLS支持**: 添加587端口的STARTTLS连接方式
|
||
|
|
- **多种连接方式**: 支持465端口SSL和587端口STARTTLS
|
||
|
|
- **完整收件人支持**: SSL方式现在也支持Cc、Bcc和附件
|
||
|
|
- **文件大小限制**: 附件大小限制为25MB,防止内存溢出
|
||
|
|
- **MIME类型检测**: 自动检测附件的正确MIME类型
|
||
|
|
|
||
|
|
### 3. 错误处理优化
|
||
|
|
- **结构化日志**: 使用Logger接口替代fmt.Println
|
||
|
|
- **详细错误信息**: 提供更具体的错误描述
|
||
|
|
- **重试机制**: 网络失败时自动重试最多3次
|
||
|
|
- **超时控制**: 连接超时设置为30秒
|
||
|
|
|
||
|
|
### 4. 代码质量提升
|
||
|
|
- **消除重复代码**: 提取公共方法处理邮件地址格式化
|
||
|
|
- **标准时间格式**: 使用RFC 1123Z标准时间格式
|
||
|
|
- **流式文件处理**: 大附件使用流式编码,节省内存
|
||
|
|
- **配置验证**: 启动时验证配置完整性
|
||
|
|
|
||
|
|
### 5. 性能优化
|
||
|
|
- **认证复用**: 在SetOption时创建认证,避免重复创建
|
||
|
|
- **连接超时**: 设置合理的连接超时时间
|
||
|
|
- **内存优化**: 大文件流式处理,避免全部加载到内存
|
||
|
|
|
||
|
|
## 新增功能
|
||
|
|
|
||
|
|
### 连接方式自动选择
|
||
|
|
```go
|
||
|
|
// 根据端口自动选择连接方式
|
||
|
|
switch port {
|
||
|
|
case "465":
|
||
|
|
// 使用直接SSL连接
|
||
|
|
case "587":
|
||
|
|
// 使用STARTTLS
|
||
|
|
default:
|
||
|
|
// 根据IsSSL配置选择
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 完整的邮件头支持
|
||
|
|
- MIME-Version: 1.0
|
||
|
|
- 标准时间格式
|
||
|
|
- 正确的Content-Type设置
|
||
|
|
- 支持Reply-To字段
|
||
|
|
|
||
|
|
### 附件处理增强
|
||
|
|
- 文件大小检查
|
||
|
|
- MIME类型自动检测
|
||
|
|
- 流式base64编码
|
||
|
|
- 76字符换行符合RFC标准
|
||
|
|
|
||
|
|
### 错误处理和日志
|
||
|
|
- 结构化错误信息
|
||
|
|
- 重试机制with指数退避
|
||
|
|
- 详细的调试日志
|
||
|
|
- 安全的配置日志输出
|
||
|
|
|
||
|
|
## 使用示例
|
||
|
|
|
||
|
|
### 基本用法
|
||
|
|
```go
|
||
|
|
smtp := NewSmtp()
|
||
|
|
smtp.SetOption(ctx, func(opt *interfaces.Options) {
|
||
|
|
opt.Smtp = &interfaces.EmailConfigDataSmtp{
|
||
|
|
Host: "smtp.gmail.com",
|
||
|
|
Port: "587",
|
||
|
|
Username: "user@gmail.com",
|
||
|
|
Password: "app-password",
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
message := interfaces.Message{
|
||
|
|
To: []string{"recipient@example.com"},
|
||
|
|
Subject: "Test Email",
|
||
|
|
Body: "<h1>Hello World</h1>",
|
||
|
|
}
|
||
|
|
|
||
|
|
err := smtp.Send(ctx, message)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 企业邮箱
|
||
|
|
```go
|
||
|
|
opt.Smtp = &interfaces.EmailConfigDataSmtp{
|
||
|
|
Host: "smtp.exmail.qq.com",
|
||
|
|
Port: "587",
|
||
|
|
Username: "admin@company.com",
|
||
|
|
Password: "password",
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### SSL连接
|
||
|
|
```go
|
||
|
|
opt.Smtp = &interfaces.EmailConfigDataSmtp{
|
||
|
|
Host: "smtp.gmail.com",
|
||
|
|
Port: "465",
|
||
|
|
Username: "user@gmail.com",
|
||
|
|
Password: "app-password",
|
||
|
|
IsSSL: true,
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 测试覆盖
|
||
|
|
|
||
|
|
- 配置验证测试
|
||
|
|
- 消息验证测试
|
||
|
|
- 邮件地址格式化测试
|
||
|
|
- 超时设置测试
|
||
|
|
- 性能基准测试
|
||
|
|
|
||
|
|
## 兼容性
|
||
|
|
|
||
|
|
- 保持与原有接口的完全兼容
|
||
|
|
- 支持所有主流邮件服务商
|
||
|
|
- 支持企业邮箱系统
|
||
|
|
- 向后兼容旧的配置方式
|
||
|
|
|
||
|
|
## 安全建议
|
||
|
|
|
||
|
|
1. 使用应用专用密码而不是账户密码
|
||
|
|
2. 在生产环境中启用TLS证书验证
|
||
|
|
3. 定期轮换邮件服务密码
|
||
|
|
4. 监控邮件发送日志以检测异常
|
||
|
|
5. 限制附件大小和类型以防止滥用
|