使用 Go 发送电子邮件:库与工具完全指南

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

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

开始课程

使用 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 的示例



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 在处理并发方面表现出色:

推荐