使用 Go (Golang) 发送电子邮件:库与工具概览
Go (Golang) 是一种现代编译型语言,非常适合构建后端服务、微服务和自动化任务。其中一项常见任务是程序化地发送电子邮件。本文将详细解析 Go 中用于处理 SMTP 的标准工具、流行的第三方库,以及发送纯文本和带附件的 HTML 邮件的示例。
标准包 net/smtp
Go 标准库中包含 net/smtp 包,它提供了通过 SMTP 服务器发送电子邮件的基本功能。该包使用简单,但需要手动构建邮件正文(包括标头、MIME 类型)。
发送纯文本邮件的简单示例
package main
import ( "fmt" "net/smtp")
func main() { // 认证信息 from := "your_email@gmail.com" password := "your_app_password" to := []string{"recipient@example.com"}
// SMTP 服务器(例如 Gmail) smtpHost := "smtp.gmail.com" smtpPort := "587"
// 邮件正文(必须包含标头) subject := "Subject: 来自 Go 的问候!" body := "这是一封使用 net/smtp 发送的测试邮件。" message := []byte(subject + "" + body)
// 认证 auth := smtp.PlainAuth("", from, password, smtpHost)
// 发送 err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, message) if err != nil { fmt.Println("发送错误:", err) return } fmt.Println("邮件发送成功!")}重要提示: 对于 Gmail,您需要使用应用专用密码,而不是普通密码。
发送 HTML 邮件和带附件的邮件
net/smtp 包无法自动构建 MIME 消息。对于 HTML 邮件或附件,您需要手动设置 Content-Type 标头并将附件编码为 base64。这很繁琐,因此对于复杂邮件,最好使用第三方库。
用于在 Go 中发送电子邮件的流行第三方库
有几个成熟的库可以大大简化工作:
- go-gomail/gomail — 最流行的库之一。支持 HTML、附件、嵌入图片和多个收件人。
- jordan-wright/email — 一个轻量级库,API 方便易用。
- sendgrid/sendgrid-go — SendGrid 服务的官方客户端(适用于批量邮件发送)。
使用 go-gomail 的示例
package main
import ( "fmt" "gopkg.in/gomail.v2")
func main() { m := gomail.NewMessage() m.SetHeader("From", "your_email@gmail.com") m.SetHeader("To", "recipient@example.com") m.SetHeader("Subject", "带附件的 HTML 邮件") m.SetBody("text/html", "<h1>你好!</h1><p>这是一封 <b>HTML</b> 邮件。</p>") m.Attach("/path/to/file.pdf") // 附件
d := gomail.NewDialer("smtp.gmail.com", 587, "your_email@gmail.com", "your_app_password")
if err := d.DialAndSend(m); err != nil { fmt.Println("错误:", err) return } fmt.Println("邮件已发送!")}异步发送和连接池
如果需要发送大量邮件(例如,用户注册后),重要的是不要阻塞主线程。Go 在处理并发方面表现出色: