概述
电子邮件是应用程序中常见的功能之一,Go 语言内置了对 SMTP 协议的支持,可以方便地用 Go 语言编写程序来发送电子邮件。
本文将简单介绍如何使用 Go 语言的 net/smtp、net/mail 等标准包来发送电子邮件。
主要内容包括
发送邮件简介
构建邮件内容
连接 SMTP 服务器
发送包含附件的邮件
设置抄送与密送
使用模板发送邮件
示例:订单确认邮件
电子邮件最佳实践
一、发送邮件简介
发送邮件主要分三步:
构建邮件内容
连接 SMTP 服务器
发送邮件
具体来说,需要设置邮件接收者、邮件正文、邮件标题等内容信息,然后连接 SMTP 服务器(如 QQ 邮箱服务器),最后把构建好的邮件发送出去。
Go 语言的 mime/multipart 包可以用来构建邮件内容,net/smtp 包实现了 SMTP 客户端,这样就可以完整实现发送邮件的功能了。
二、构建邮件内容
构建邮件首先需要定义邮件接收者,可以用 mail.Address 表示
to := mail.Address{Name: "Go先锋", Address: "abc@xyz.com"}
然后设置邮件标题、正文
subject := "来自Go的问候"body := "这是一封用Go语言发送的邮件"
接着创建一个 mime.Writer,设置邮件 MIME 类型为"multipart/alternative":
header := make(textproto.MIMEHeader)header.Set("MIME-Version", "1.0")header.Set("Content-Type", "multipart/alternative") var message bytes.Buffer mw := multipart.NewWriter(&message)mw.SetBoundary("xxx")
最后把内容使用 mw.CreatePart 添加到邮件,完成邮件内容构建。
三、连接 SMTP 服务器
常用的邮箱 SMTP 服务器地址包括:
QQ 邮箱:smtp.qq.com
163 邮箱:smtp.163.com
126 邮箱:smtp.126.com
使用 net/smtp 包连接 SMTP 服务器:
auth := smtp.PlainAuth( "from@abc.com", "from@abc.com", "pwd123", "smtp.qq.com") err := smtp.SendMail( "smtp.qq.com:25", auth, from, []string{to.Address}, message.Bytes())
这样就可以连接服务器并发送邮件了。注意校验发送错误。
四、发送包含附件的邮件
如果要在邮件中添加附件,可以在创建 part 时添加:
// 添加附件部分 ap, _ := mw.CreatePart(textproto.MIMEHeader{ Content-Type: "application/octet-stream", Content-Disposition: `attachment; filename="file.zip"`}) ap.Write([]byte("zip file data"))
创建附件 part 时,需要正确设置 Content-Type 和 Content-Disposition 等头信息。
五、设置抄送与密送
使用 mail.Address 可以方便地设置抄送(Cc)和密送(Bcc):
// 抄送cc := mail.Address{Name: "小明", Address: "ccc@xyz.com"} // 密送bcc := mail.Address{Name: "小飞", Address: "bcc@xyz.com"} err := smtp.SendMail(addr, auth, from, to, msg, cc, bcc)
这样可以在不暴露地址的情况下发送邮件。
六、使用模板发送邮件
可以使用 text/template 创建邮件模板来简化邮件发送:
t := template.New("mail")t.Parse(`您好 {{.Name}}, 您的订单已确认!订单号:{{.OrderId}}`) var data struct { Name string OrderId int} // 渲染模板msg := bytes.Buffer{} t.Execute(&msg, data)
可以将变量注入模板,生成邮件内容。
七、示例:订单确认邮件
编写一个发送订单确认邮件的示例
type Order struct { Id int Product string Email string} // 订单数据order := Order{Id: 12345, Product: "Macbook Pro", Email: "john@abc.com"} // 1. 设置邮件接收者为订单的Emailto := mail.Address{Address: order.Email} // 2. 设置邮件内容使用模板 t := ParseTemplate(`Dear {{.Name}}, 您于{{.Date | formatDate}}下单购买了{{.Product}},订单确认号:{{.OrderId}},请注意查收!`) data := struct{ Name string Product string OrderId int}{ Name: "John", Product: order.Product, OrderId: order.Id, } // 3. 连接SMTP服务器并发送SendSMTPMail(to, t.Execute(data))
可以非常方便地发送动态生成的确认邮件了。
八、电子邮件最佳实践
最后,在使用电子邮件时还需要注意
使用模板引擎生成邮件内容
正确设置邮件标题、格式
处理错误及重试机制
检查 spam 词汇
添加退订说明等
合理使用可以提升邮件传递率,避免被过滤。