Go (Golang) 邮件发送:库与代码示例

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

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

开始课程

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(

推荐