Go语言通过SMTP发送电子邮件的完整实现

顾星河
顾星河
发布时间:2026-10-13| 4人浏览过
原创

介绍如何利用 Go 标准库中的 net/smtp 和 encoding/base64 包,通过 SMTP 协议发送格式规范的 HTML 邮件。涵盖认证配置、标题编码及消息体构造的关键步骤。

准备条件与环境依赖

Go 语言的标准库已经内置了 net/smtp 模块,无需安装第三方依赖即可实现基础的 SMTP 功能。在开始编写代码前,需确认以下信息:

  1. SMTP 服务器地址:如 smtp.mail.com。
  2. 端口号:通常为 25(非加密)或 465/587(SSL/TLS),本示例使用默认 25 端口进行演示。
  3. 发件人账号与密码:用于登录认证的有效邮箱凭证。
  4. 目标收件人列表:至少包含一个有效的接收邮箱地址。

第1步:引入必要的标准库

为了实现邮件发送,我们需要导入格式化输出、邮件地址解析、SMTP 客户端以及 Base64 编码功能的包。在 main 函数开始前,添加以下 import 块:

package main

import (
	"fmt"
	"net/mail"
	"net/smtp"
	"encoding/base64"
)

第2步:配置连接参数与认证信息

首先定义 SMTP 主机、发件人邮箱及授权密码。使用 mail.Address 结构体来规范化显示名称和邮箱地址,这有助于生成符合 RFC 标准的 From 和 To 头部字段。

b64 := base64.NewEncoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")
host := "smtp.mail.com"
email := "mail1@mail.com"
password := "password"
toEmail := "mail2@mail.com"

from := mail.Address{"发送人", email}
to := mail.Address{"接收人", toEmail}

第3步:构建邮件头部 (Headers)

SMTP 协议要求邮件头部必须包含特定的字段,包括发件人、收件人、主题、MIME 版本及字符集编码。对于包含中文等非 ASCII 字符的标题,建议采用 ?UTF-8?B? 格式的 Base64 编码以确保兼容性。

header := make(map[string]string)
header["From"] = from.String()
header["To"] = to.String()
header["Subject"] = fmt.Sprintf("=?UTF-8?B?%s?=", b64.EncodeToString([]byte("邮件标题2")))
header["MIME-Version"] = "1.0"
header["Content-Type"] = "text/html; charset=UTF-8"
header["Content-Transfer-Encoding"] = "base64"

第4步:组装邮件消息体

邮件内容分为头部和正文两部分,中间以空行 (\r\n) 分隔。先将所有 Header 字段按顺序拼接,追加换行符后,再将经过 Base64 编码的邮件正文附加其后。注意:若未使用 Base64 编码正文,需将 Content-Transfer-Encoding 设为 8bit 或直接删除该头部。

body := "我是一封电子邮件!golang发出."
message := ""
for k, v := range header {
	message += fmt.Sprintf("%s: %s\r\n", k, v)
}
message += "\r\n" + b64.EncodeToString([]byte(body))

第5步:执行发送并处理错误

使用 smtp.SendMail 函数发起连接。首先需要创建认证对象,这里演示最基础的明文认证方式 smtp.PlainAuth。调用发送接口时,确保地址字符串格式正确,并对返回的 error 进行处理。

auth := smtp.PlainAuth(
	"",
	email,
	password,
	host,
)

err := smtp.SendMail(
	host+":25",
	auth,
	email,
	[]string{to.Email},
	[]byte(message),
)

if err != nil {
	panic(err)
}

完成判断与注意事项

当 smtp.SendMail 返回 nil 时,表示邮件已成功提交至 SMTP 服务器。以下是实际应用中需要注意的关键点:

  • 安全性升级:生产环境中,25 端口往往不被允许或未加密。推荐使用 smtp.StartTLS 或 tls.Dial 连接 465/587 端口,以保证传输安全。
  • 附件支持:上述代码仅发送纯文本或简单 HTML。如需发送文件附件,需使用 multipart/mixed MIME 类型构建复杂的 Body 结构,或使用第三方库如 go-mail 简化操作。
  • 频率限制:部分 SMTP 服务商对短时间内的并发请求有限制,建议在后台任务中加入适当的延迟队列机制。

以上就是 Go 语言利用 net/smtp 包实现电子邮件发送的详细内容,更多关于 Golang 网络编程与邮件服务的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。