Gomail介绍
Gomail是Golang一个简单高效的用于发送电子邮件的包。它经过了充分测试和文档化。
Gomail只能使用SMTP服务器发送电子邮件。但是该API是灵活的,可以轻松实现使用本地的Postfix、API等方法发送电子邮件。
它使用gopkg.in进行版本控制,所以每个版本内将不会有不兼容的改变。
它要求使用Go 1.2或更新版本。在Go 1.5中,不会使用外部依赖项。
Gomail特点
Gomail支持以下功能:
- 附件
- 内嵌图像
- HTML和文本模板
- 特殊字符的自动编码
- SSL和TLS
- 使用相同的SMTP连接发送多封电子邮件
安装
go get gopkg.in/gomail.v2
示例
m := gomail.NewMessage()
m.SetHeader("From", "alex@example.com")
m.SetHeader("To", "bob@example.com", "cora@example.com")
m.SetAddressHeader("Cc", "dan@example.com", "Dan")
m.SetHeader("Subject", "Hello!")
m.SetBody("text/html", "Hello <b>Bob</b> and <i>Cora</i>!")
m.Attach("/home/Alex/lolcat.jpg")
d := gomail.NewDialer("smtp.example.com", 587, "user", "123456")
// 发送邮件给Bob、Cora和Dan。
if err := d.DialAndSend(m); err != nil {
panic(err)
}
示例(守护进程)
一个监听频道并发送所有接收到的消息的守护进程。
ch := make(chan *gomail.Message)
go func() {
d := gomail.NewDialer("smtp.example.com", 587, "user", "123456")
var s gomail.SendCloser
var err error
open := false
for {
select {
case m, ok := <-ch:
if !ok {
return
}
if !open {
if s, err = d.Dial(); err != nil {
panic(err)
}
open = true
}
if err := gomail.Send(s, m); err != nil {
log.Print(err)
}
// 如果在过去的30秒内没有发送邮件,关闭与SMTP服务器的连接。
case <-time.After(30 * time.Second):
if open {
if err := s.Close(); err != nil {
panic(err)
}
open = false
}
}
}
}()
// 在你的程序中使用该频道发送邮件。
// 关闭该频道以停止邮件守护进程。
close(ch)
示例(邮件订阅)
有效地向一组收件人发送定制的邮件订阅。
// 收件人列表。
var list []struct {
Name string
Address string
}
d := gomail.NewDialer("smtp.example.com", 587, "user", "123456")
s, err := d.Dial()
if err != nil {
panic(err)
}
m := gomail.NewMessage()
for _, r := range list {
m.SetHeader("From", "no-reply@example.com")
m.SetAddressHeader("To", r.Address, r.Name)
m.SetHeader("Subject", "Newsletter #1")
m.SetBody("text/html", fmt.Sprintf("Hello %s!", r.Name))
if err := gomail.Send(s, m); err != nil {
log.Printf("Could not send email to %q: %v", r.Address, err)
}
m.Reset()
}
示例(无身份验证)
使用本地SMTP服务器发送电子邮件。
m := gomail.NewMessage()
m.SetHeader("From", "from@example.com")
m.SetHeader("To", "to@example.com")
m.SetHeader("Subject", "Hello!")
m.SetBody("text/plain", "Hello!")
d := gomail.Dialer{Host: "localhost", Port: 587}
if err := d.DialAndSend(m); err != nil {
panic(err)
}
示例(NoSMTP)
使用API或postfix发送电子邮件。
m := gomail.NewMessage()
m.SetHeader("From", "from@example.com")
m.SetHeader("To", "to@example.com")
m.SetHeader("Subject", "Hello!")
m.SetBody("text/plain", "Hello!")
s := gomail.SendFunc(func(from string, to []string, msg io.WriterTo) error {
// 通过调用API或运行postfix等实现您的邮件发送函数
fmt.Println("From:", from)
fmt.Println("To:", to)
return nil
})
if err := gomail.Send(s, m); err != nil {
panic(err)
}
常见问题
x509: 证书由未知证书机构签名
如果您遇到此错误,表示Gomail运行的客户端认为SMTP服务器使用的证书无效。作为临时解决方法,您可以通过使用SetTLSConfig绕过对服务器证书链和主机名的验证:
package main
import (
"crypto/tls"
"gopkg.in/gomail.v2"
)
func main() {
d := gomail.NewDialer("smtp.example.com", 587, "user", "123456")
d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
// 使用d发送电子邮件。
}
但请注意,这是不安全的,不应在生产环境中使用。