go使用smtp批量发送邮件的正确姿势

前提概要

今天在处理发送邮件需求的时候遇到了一个棘手的问题,想使用单封邮件发送给多个收件人,百度谷歌搜索下来都是遍历发送,这种其实是绕过了问题,于是我踩坑个把小时,整理此文。

smtp发送原理

https://golang.google.cn/pkg/net/smtp/#SendMail
golang的smtp包手册里面有介绍smtp的用法,注意看msg参数的介绍,说它遵循RFC822的格式。

image.png

这个格式我想知道怎么进行批量发送,于是找到这个格式定义的文档,其中的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 之后有个空格,很关键,少了这个就无法满足格式导致邮件发送不出去。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。