go使用smtp批量发送邮件的正确姿势
2020-08-14 本文已影响0人
webxiaohua
前提概要
今天在处理发送邮件需求的时候遇到了一个棘手的问题,想使用单封邮件发送给多个收件人,百度谷歌搜索下来都是遍历发送,这种其实是绕过了问题,于是我踩坑个把小时,整理此文。
smtp发送原理
https://golang.google.cn/pkg/net/smtp/#SendMail
golang的smtp包手册里面有介绍smtp的用法,注意看msg参数的介绍,说它遵循RFC822的格式。
这个格式我想知道怎么进行批量发送,于是找到这个格式定义的文档,其中的3.1.1章节有具体介绍这种格式的写法,
看我们代码:
type Email struct {
to string "to" // 多个用 ; 分隔
subject string "subject"
msg string "msg"
}
func (s *Service) SendEmail(email *Email) error {
auth := smtp.PlainAuth("", EMAIL_USER, EMAIL_PASSWORD, EMAIL_HOST)
sendTo := strings.Split(email.to, ";")
rfc822_to := strings.Join(sendTo, ",\r\n ")
str := fmt.Sprintf("From: %s\r\nTo: %s\r\nsubject: %s\r\n\r\n%s", EMAIL_USER, rfc822_to, email.subject, email.msg)
err := smtp.SendMail(
EMAIL_SERVER_ADDR,
auth,
EMAIL_USER,
sendTo,
[]byte(str),
)
return err
}
注意在 rfc822_to
变量这里,\r\n
之后有个空格,很关键,少了这个就无法满足格式导致邮件发送不出去。