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

2020-08-14  本文已影响0人  webxiaohua
前提概要

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

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 之后有个空格,很关键,少了这个就无法满足格式导致邮件发送不出去。

上一篇下一篇

猜你喜欢

热点阅读