3.3 KiB
3.3 KiB
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时创建认证,避免重复创建
- 连接超时: 设置合理的连接超时时间
- 内存优化: 大文件流式处理,避免全部加载到内存
新增功能
连接方式自动选择
// 根据端口自动选择连接方式
switch port {
case "465":
// 使用直接SSL连接
case "587":
// 使用STARTTLS
default:
// 根据IsSSL配置选择
}
完整的邮件头支持
- MIME-Version: 1.0
- 标准时间格式
- 正确的Content-Type设置
- 支持Reply-To字段
附件处理增强
- 文件大小检查
- MIME类型自动检测
- 流式base64编码
- 76字符换行符合RFC标准
错误处理和日志
- 结构化错误信息
- 重试机制with指数退避
- 详细的调试日志
- 安全的配置日志输出
使用示例
基本用法
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)
企业邮箱
opt.Smtp = &interfaces.EmailConfigDataSmtp{
Host: "smtp.exmail.qq.com",
Port: "587",
Username: "admin@company.com",
Password: "password",
}
SSL连接
opt.Smtp = &interfaces.EmailConfigDataSmtp{
Host: "smtp.gmail.com",
Port: "465",
Username: "user@gmail.com",
Password: "app-password",
IsSSL: true,
}
测试覆盖
- 配置验证测试
- 消息验证测试
- 邮件地址格式化测试
- 超时设置测试
- 性能基准测试
兼容性
- 保持与原有接口的完全兼容
- 支持所有主流邮件服务商
- 支持企业邮箱系统
- 向后兼容旧的配置方式
安全建议
- 使用应用专用密码而不是账户密码
- 在生产环境中启用TLS证书验证
- 定期轮换邮件服务密码
- 监控邮件发送日志以检测异常
- 限制附件大小和类型以防止滥用