一架梯子,一头程序猿,仰望星空!

Gomail发邮件教程

Gomail是Golang的一个简单高效的用于发送电子邮件的包。

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发送电子邮件。
}

但请注意,这是不安全的,不应在生产环境中使用。


章节目录