在 Go (Golang) 中发送电子邮件:库与代码示例
发送电子邮件是任何 Web 应用程序的关键任务之一:用户注册、密码重置、通知和邮件群发。在 Go (Golang) 语言中,既有用于处理 SMTP 的标准工具,也有强大的第三方库,可简化发送带有 HTML 模板、附件并支持不同邮件服务的邮件。在本文中,我们将详细介绍如何在 Go 中发送电子邮件,分析流行的库,并提供实用的代码示例。
标准库 net/smtp
net/smtp 包是 Go 标准库的一部分,提供了通过 SMTP 服务器发送邮件的最小功能集。它适用于简单的文本消息,但需要根据 RFC 5322 手动构建邮件头和正文。
发送简单文本邮件的示例:
package main
import ( "fmt" "net/smtp")
func main() { // 连接到 SMTP 服务器的数据 smtpHost := "smtp.example.com" smtpPort := "587" from := "sender@example.com" password := "your_password" to := []string{"recipient@example.com"}
// 构建邮件正文(必须包含邮件头) subject := "Subject: 来自 Go 的问候!" mime := "MIME-version: 1.0;Content-Type: text/plain; charset=\\"UTF-8\\";
" body := "这是一封使用 Go 发送的测试邮件。" msg := []byte(subject + mime + 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("邮件发送成功!")}net/smtp 的局限性:
- 不手动进行 Base64 编码则不支持附件。
- 需要自行格式化 MIME 头。
- 不便于发送带图片的 HTML 邮件。
gomail/v2 库
Go 中最流行的第三方发送电子邮件库之一是 gomail(包 gopkg.in/mail.v2)。它提供了便捷的邮件处理 API:支持附件、HTML 和文本部分、SMTP 连接配置,以及通过 SSL/TLS 发送。
安装:
go get gopkg.in/mail.v2发送带附件的 HTML 邮件示例:
package main
import ( "fmt" "gopkg.in/mail.v2")
func main() { m := mail.NewMessage() m.SetHeader("From", "sender@example.com") m.SetHeader("To", "recipient@example.com") m.SetHeader("Subject", "带附件的 HTML 邮件")
// 替代部分:文本和 HTML m.SetBody("text/plain", "如果您看到此文本,您的客户端不支持 HTML。") m.AddAlternative("text/html", "<h1>你好!</h1><p>这是邮件的 HTML 版本。</p>")
// 添加附件 m.Attach("/path/to/file.pdf")
// 配置 SMTP 客户端 d := mail.NewDialer("smtp.example.com", 587, "sender@example.com", "your_password") d.StartTLSPolicy = mail.MandatoryStartTLS
if err := d.DialAndSend(m); err != nil { fmt.Println("错误:", err) return } fmt.Println("邮件已发送!")}gomail 的优势:
- 简单直观的 API。
- 自动生成 MIME 头。
- 支持附件和内嵌图片 (CID)。
- 支持 SSL/TLS 和 StartTLS。
go-smtp 库 (emersion/go-smtp)
emersion 的 go-smtp 库是一个更底层的替代方案,可完全控制 SMTP 连接。如果您需要