=Start=
缘由:
在程序运行期间,因为所处环境、依赖条件等的各种变化,不可避免的会出现意想不到的情况(异常/错误),针对其中的运行时异常,我们一般会通过邮件或IM来通知运维人员,以采取相应措施,这里就整理一下用Go 语言编程实现邮件发送功能的例子,方便以后参考和使用。
正文:
参考解答:
下面这个例子比较简单,改一下对应的用户名、密码、SMTP地址以及收件人就可以进行测试。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
package main import ( "fmt" "net/smtp" "strings" ) func SendToMail(user, password, host, to, subject, body, mailtype string) error { hp := strings.Split(host, ":") var content_type string if mailtype == "html" { content_type = "Content-Type: text/" + mailtype + "; charset=UTF-8" } else { content_type = "Content-Type: text/plain" + "; charset=UTF-8" } msg := []byte("To: " + to + "\r\nFrom: " + user + "\r\nSubject: " + subject + "\r\n" + content_type + "\r\n\r\n" + body) send_to := strings.Split(to, ";") auth := smtp.PlainAuth("", user, password, hp[0]) err := smtp.SendMail(host, auth, user, send_to, msg) return err } func main() { user := "user@163.com" password := "password" host := "smtp.163.com:25" subject := "使用Golang发送邮件" to := "user@qq.com" body := ` <html> <body> <h3> Test to use Golang send mail. </h3> </body> </html> ` fmt.Println("Send mail") err := SendToMail(user, password, host, to, subject, body, "html") if err != nil { fmt.Println("Send mail error!") fmt.Println(err) } else { fmt.Println("Send mail success!") } } |
如果要用到实际的生产环境中,还需要解决几个问题才会显得好一些,比如:
- 对固定的user/password/host这几个字段全局化处理,只做一次PlainAuth操作得到auth变量,将后续同一个user的发件都共用auth变量进行;
- 可以考虑借助template改进一下邮件格式,增强用户体验;
- 增加「抄送(CC)/密送(BCC)」的功能;
- 增加「可添加附件」的功能;
参考链接:
- GO使用SMTP发送邮件#测试OK
- https://golang.org/pkg/net/smtp/
- Golang 发送邮件#未测试
- Golang1.7.3发送大附件邮件#未测试
- 使用golang实现批量发送面试邀请邮件
- golang 通过 qq 开通smtp 发送邮件的 全步骤(tls +ssl)
=END=