
本文介绍在 go 服务中批量发送已渲染邮件至 sendgrid 的最优实践,重点对比 smtp 与 rest api(批量发送)的性能差异,并推荐采用 sendgrid v3 rest api 的批量提交方式(单次请求最多 1000 封邮件),显著提升吞吐量并降低延迟。
本文介绍在 go 服务中批量发送已渲染邮件至 sendgrid 的最优实践,重点对比 smtp 与 rest api(批量发送)的性能差异,并推荐采用 sendgrid v3 rest api 的批量提交方式(单次请求最多 1000 封邮件),显著提升吞吐量并降低延迟。
当你的系统已具备独立的邮件模板渲染能力(例如基于 Go 的服务完成模板填充、个性化变量注入、多语言适配等),下一步的关键在于高效、可靠、可监控地将已渲染的纯文本/HTML 邮件内容投递至 SendGrid。面对 600,000 封邮件的批量场景,传输层选型直接决定整体耗时与资源开销。
✅ 推荐方案:SendGrid v3 REST API + 批量提交(Batch Mode)
SendGrid 官方 v3 API 支持单次 HTTP POST 请求携带最多 1000 封邮件(注意:每封邮件需为独立 personalizations 对象,共享同一 content 和 from 等公共字段)。相比逐封调用 REST 或传统 SMTP 连接,该模式大幅减少网络往返(RTT)、连接建立开销及认证频率。
以下为典型 Go 实现片段(使用官方 sendgrid-go SDK):
import (
"github.com/sendgrid/sendgrid-go"
"github.com/sendgrid/sendgrid-go/helpers/mail"
)
func sendBatchEmails(apiKey string, emails []mail.Email) error {
sg := sendgrid.NewSendClient(apiKey)
// 构建批量邮件对象(最多 1000 封)
from := mail.NewEmail("Sender Name", "from@yourdomain.com")
subject := "Your Rendered Email Subject"
content := mail.NewContent("text/html", "<h1>Hello {{name}}</h1>...") // 已渲染完成的 HTML
msg := mail.NewV3Mail()
msg.SetFrom(from)
msg.Subject = subject
msg.AddContent(content)
// 添加多个收件人(每个含唯一 personalization)
for _, e := range emails {
p := mail.NewPersonalization()
p.AddTo(e)
p.SetDynamicTemplateData(map[string]interface{}{
"name": "John Doe", // 已在上游渲染服务中完成动态数据注入
})
msg.AddPersonalization(p)
}
request := sendgrid.GetRequest(apiKey, "/v3/mail/send", "https://api.sendgrid.com")
request.Method = "POST"
request.Body = msg.Get()
response, err := sg.Client.API(request)
if err != nil {
return err
}
if response.StatusCode >= 400 {
return fmt.Errorf("SendGrid API error: %d %s", response.StatusCode, string(response.Body))
}
return nil
}
⚠️ 注意事项:
- 每批次严格限制为 ≤1000 封:超出将被 API 拒绝(HTTP 400);
- 总请求体大小 ≤ 50MB:包含所有 HTML 内容、附件(如有)和元数据;
- 务必预渲染完成:SendGrid 不执行模板引擎,dynamic_template_data 仅用于其内部模板(若你用的是其动态模板),而本文场景下应传入完全渲染好的 text/html 和 text/plain 内容;
- 并发控制建议:启动 5–10 个 goroutine 并行提交批次(如每批 500 封),避免单点瓶颈;同时监控 SendGrid 的速率限制(默认 1200 TPS,可申请提升);
- 错误处理与重试:对 HTTP 429(限流)、5xx 错误实现指数退避重试;记录失败批次 ID 便于溯源。
❌ 不推荐方案对比
- SMTP:虽协议简单,但每封邮件需完整 SMTP 会话(HELO → AUTH → MAIL FROM → RCPT TO → DATA),实测吞吐通常 ≤5–10 封/秒,60 万封需数小时,且连接池管理复杂、TLS 开销高;
- 单封 REST 调用:60 万次 HTTPS 请求带来巨大 TCP 连接建立/关闭开销、DNS 查询压力及客户端资源占用,即使并发 100,仍远低于批量模式效率。
总结
对于已渲染邮件的高吞吐场景,SendGrid v3 REST API 的批量提交是唯一兼顾性能、可靠性与运维简洁性的选择。合理分批(如每批 500–800 封)、并发调度、预渲染+静态内容直传,可轻松实现 10,000–15,000 封/分钟 的稳定投递速度——60 万封邮件可在 5–8 分钟内完成。务必结合日志、指标(如批次成功率、响应延迟)与 SendGrid 的活动仪表盘进行端到端监控。











