在 Go (Golang) 中发送电子邮件:库与代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 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 连接。如果您需要

推荐