最近工作上有个需要发送邮件的需求,所以研究了下golang怎么发送邮件,这里记录下。
- 这里推荐一个第三方库
go get -v github.com/jordan-wright/email
之前也研究了官方库net/smtp
,以及其他第三方库如gomail
但是都不符合我的开发需求,使用的这个第三方库完美的解决了需求。 - 下面写个例子,演示一下
email
第三方库的使用,以及使用自定义模板发送邮件
首先在同级目录创建email-template.html
,main.go
两个文件。
// email-template.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h4>亲爱的{{.ToUserName}},您好!</h4>
<div>{{.Message}}</div>
</br>
<div>
{{.FromUserName}} </br>
{{.TimeDate}}
</div>
</body>
</html>
// main.go
package main
import (
"bytes"
"html/template"
"log"
"net/smtp"
"time"
"github.com/jordan-wright/email"
)
func SendMail(fromUser, toUser, subject string) error {
// NewEmail返回一个email结构体的指针
e := email.NewEmail()
// 发件人
e.From = fromUser
// 收件人(可以有多个)
e.To = []string{toUser}
// 邮件主题
e.Subject = subject
// 解析html模板
t,err := template.ParseFiles("email-template.html")
if err != nil {
return err
}
// Buffer是一个实现了读写方法的可变大小的字节缓冲
body := new(bytes.Buffer)
// Execute方法将解析好的模板应用到匿名结构体上,并将输出写入body中
t.Execute(body,struct {
FromUserName string
ToUserName string
TimeDate string
Message string
}{
FromUserName: "go语言",
ToUserName: "Sixah",
TimeDate: time.Now().Format("2006/01/02"),
Message: "golang是世界上最好的语言!",
})
// html形式的消息
e.HTML = body.Bytes()
// 从缓冲中将内容作为附件到邮件中
e.Attach(body, "email-template.html", "text/html")
// 以路径将文件作为附件添加到邮件中
e.AttachFile("/home/shuai/go/src/email/main.go")
// 发送邮件(如果使用QQ邮箱发送邮件的话,passwd不是邮箱密码而是授权码)
return e.Send("smtp.qq.com:587", smtp.PlainAuth("", "xxx@qq.com", "passwd", "smtp.qq.com"))
}
func main() {
fromUser := "golang<xxx@qq.com>"
toUser := "xxx@qq.com"
subject := "hello,world"
err := SendMail(fromUser,toUser,subject)
if err != nil {
log.Println("发送邮件失败")
return
}
log.Println("发送邮件成功")
}
-
下面是发送效果
附件中的中文是没有乱码的,email在解析附件的时候添加到了正文中,字符编码不是UTF-8所以显示有乱码。
时间有限,今天就先到这里啦,有空再修改更新。
有疑问加站长微信联系(非本文作者)