Go (Golang) 邮件发送:库与工具全面概览
在现代 Web 开发中,发送电子邮件仍然是通知、注册、密码重置和邮件群发的关键任务之一。Go 语言 (Golang) 提供了几种与 SMTP 服务器集成的有效方法。在本文中,我们将介绍标准库 net/smtp、流行的第三方库 gomail 以及功能更丰富的 go-smtp。您将学习如何发送纯文本和 HTML 邮件、添加附件以及配置安全连接。
1. 标准库 net/smtp
net/smtp 包内置于 Go 中,无需额外安装。它提供了连接到 SMTP 服务器、身份验证和发送消息的基本功能。但是,要满足现代需求(HTML、附件、SSL/TLS),则需要编写更多代码。
发送纯文本邮件的简单示例
package main
import ( "fmt" "net/smtp")
func main() { // SMTP 服务器设置(以 Gmail 为例) smtpHost := "smtp.gmail.com" smtpPort := "587" from := "your_email@gmail.com" password := "your_app_password" to := []string{"recipient@example.com"}
// 邮件主题和正文(最简单的格式) subject := "Subject: 来自 Go 的测试邮件" body := "你好!这是通过 net/smtp 发送的消息。" msg := []byte(subject + "" + body)
// 身份验证 auth := smtp.PlainAuth("", from, password, smtpHost)
// 发送 err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, msg) if err != nil { fmt.Println("发送错误:", err) return } fmt.Println("邮件发送成功!")}重要提示: 对于 Gmail,您需要使用应用专用密码(而非主密码)并允许不太安全的应用程序访问。对于其他服务(Yandex、Mail.ru),参数可能有所不同。
通过 net/smtp 发送 HTML 邮件
要发送 HTML 邮件,需要显式指定 Content-Type 标头:
package main
import ( "fmt" "net/smtp")
func main() { smtpHost := "smtp.gmail.com" smtpPort := "587" from := "your_email@gmail.com" password := "your_app_password" to := []string{"recipient@example.com"}
// 构建 MIME 标头 headers := make(map[string]string) headers["From"] = from headers["To"] = "recipient@example.com" headers["Subject"] = "来自 Go 的 HTML 邮件" headers["MIME-Version"] = "1.0" headers["Content-Type"] = "text/html; charset=\\"UTF-8\\""
// 组装消息 message := "" for k, v := range headers { message += fmt.Sprintf("%s: %s\\r", k, v) } message += "\\r" + "<h1>你好!</h1><p>这是一封 <b>HTML</b> 邮件。</p>"
auth := smtp.PlainAuth("", from, password, smtpHost) err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, []byte(message)) if err != nil { fmt.Println("错误:", err) }}net/smtp 的缺点是不支持附件和复杂的多部分邮件结构。对于此类任务,最好使用专门的库。
2. gomail 库
Gomail 是 Go 中最流行的第三方邮件发送库之一。它提供了便捷的 API,支持 HTML、附件、图片嵌入、SSL/TLS 和可自定义的标头。
安装
go get gopkg.in/mail.v2发送带附件的 HTML 邮件示例
package main
import ( "crypto/tls" "fmt" gomail "gopkg.in/mail.v2")
func main() { m := gomail.NewMessage(