讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

Seko
Seko

AI短剧一键生成成片

AniShort
AniShort

AI短剧协同制作平台

updream

一键生成高质量推广成片

如何在Golang中实现邮件发送功能_Golang SMTP发送与错误处理示例

浅晨姑娘_7636

浅晨姑娘_7636

发布时间:2026-01-01 19:32:40

|

859人浏览过

|

来源于php中文网

原创

最简可行路径是四步:构造带Base64编码中文Subject的邮件头、组装MIME内容、建立带认证的SMTP连接、调用client.SendMail;须严格匹配服务商配置,预检端口连通性,避免乱码与认证失败。

如何在golang中实现邮件发送功能_golang smtp发送与错误处理示例

用 net/smtp 发送纯文本邮件最简可行路径

Go 标准库的 net/smtp 足够完成基础邮件发送,无需第三方包。关键不是“能不能发”,而是怎么避开认证失败、连接超时、编码乱码这三类高频问题。

核心步骤就四步:构造邮件头 + 组装 MIME 内容 + 建立带认证的 SMTP 连接 + 调用 client.SendMail。注意:SMTP 服务器地址、端口、账号密码必须严格匹配服务商要求(比如 Gmail 必须开“应用专用密码”,QQ 邮箱需开启 SMTP 并用授权码)。

  • 邮件正文必须手动拼接 To、From、Subject 和 MIME-Version 等头字段,不能只写正文内容
  • Subject 含中文时,必须用 =?UTF-8?B?... Base64 编码,否则收件端显示乱码
  • 连接前建议先用 net.DialTimeout 测试端口连通性,避免 SendMail 报错时无法区分是网络问题还是认证问题
package main

import (
	"fmt"
	"net/smtp"
	"time"
)

func sendPlainTextEmail() error {
	from := "user@example.com"
	password := "your_app_password" // 不是登录密码
	to := []string{"receiver@example.com"}
	smtpHost := "smtp.example.com"
	smtpPort := "587"

	msg := []byte("To: " + to[0] + "\r\n" +
		"From: " + from + "\r\n" +
		"Subject: =?UTF-8?B?5byg5LiJ55WM?=\r\n" + // “测试邮件” Base64 编码
		"MIME-Version: 1.0\r\n" +
		"Content-Type: text/plain; charset=UTF-8\r\n\r\n" +
		"这是一封 Go 发送的纯文本邮件。\r\n")

	auth := smtp.PlainAuth("", from, password, smtpHost)
	client, err := smtp.Dial(smtpHost + ":" + smtpPort)
	if err != nil {
		return fmt.Errorf("dial failed: %w", err)
	}
	defer client.Close()

	if err = client.Auth(auth); err != nil {
		return fmt.Errorf("auth failed: %w", err)
	}

	if err = client.Mail(from); err != nil {
		return fmt.Errorf("mail from failed: %w", err)
	}
	for _, addr := range to {
		if err = client.Rcpt(addr); err != nil {
			return fmt.Errorf("rcpt to %s failed: %w", addr, err)
		}
	}

	w, err := client.Data()
	if err != nil {
		return fmt.Errorf("data failed: %w", err)
	}
	_, err = w.Write(msg)
	if err != nil {
		return fmt.Errorf("write msg failed: %w", err)
	}
	err = w.Close()
	if err != nil {
		return fmt.Errorf("close data failed: %w", err)
	}

	return nil
}

发 HTML 邮件必须处理 Content-Type 多部分边界

HTML 邮件本质是 multipart/alternative 类型,需手动构造边界字符串(boundary),并确保正文和 HTML 版本都包裹在对应 boundary 段内。漏掉 -- 前缀、边界不一致、缺少空行,都会导致邮件客户端解析失败,显示为原始 MIME 文本。

  • 边界字符串推荐用 time.Now().UnixNano() 生成唯一值,避免硬编码重复
  • 每个 part 的 Content-Type 后必须跟空行,再写内容;结尾 boundary 必须以 -- 开头且单独成行
  • HTML 中的图片、CSS 不能直接引用本地路径,只能用内联 base64 或外部链接(后者依赖收件方网络环境)

smtp.SendMail 返回错误但没具体原因?检查底层连接状态

smtp.SendMail 是个便利函数,但它把连接、认证、发送全包在一起,一旦失败,错误信息常是模糊的 EOF 或 i/o timeout,根本看不出卡在哪步。生产环境必须拆开调用 smtp.Client 的各方法,逐层捕获错误。

Word 文档生成与编辑
Word 文档生成与编辑

需要创建、读取、编辑或处理 Word 文档(.docx / .dotx)时使用。触发词:'Word'、'word 文档'、'.docx'、'生成报告'、'制作合同/简历/方案/说明书'、'提取 word 内容'、'在文档里查找替换'、'给文档加页眉页脚/目录/表格'。也用于把任意内容排版成一份正式的 Word 文件。不要用它处理 PDF、Excel 或无关编程任务。中文创作场景尤其适合:小说大纲稿、投稿文档、合同、简历、工作总结。

下载

立即学习“go语言免费学习笔记(深入)”;

  • 调用 smtp.Dial 后立即检查 err,确认 TCP 层是否通
  • client.Auth 失败大概率是账号密码错或服务商禁用了 SMTP,而非网络问题
  • client.Rcpt 报错说明收件地址被拒(如格式错误、域名不存在、被对方服务器拉黑)
  • 最后 client.Data 和 w.Write 出错,基本可定位为邮件内容格式违规(如 header 缺失、boundary 错位)

并发发信要控制连接池和重试逻辑

直接 for 循环调用 smtp.Dial 发 100 封邮件,大概率触发目标 SMTP 服务器的频率限制,返回 554 Too many connections 或被临时封 IP。Go 里没有内置 SMTP 连接池,得自己封装复用逻辑。

  • 单个 *smtp.Client 实例可复用多次 SendMail,但不能并发调用(非线程安全),需加 sync.Mutex
  • 更稳妥的做法是用 sync.Pool 缓存已认证的 client,设置最大空闲数(如 5),超时自动关闭
  • 对临时性错误(如 421 Service not available)应加入指数退避重试,但对 5xx 永久错误(如 535 Authentication failed)必须立刻停止并告警

真正难的不是写出能发邮件的代码,而是让每封邮件的状态可追踪、失败原因可归类、重试不放大问题。SMTP 协议本身不提供投递回执,所有可靠性都要靠日志、监控和幂等设计兜底。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

539

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

616

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1276

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

791

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1866

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

5334

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

2474

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

4326

2025.06.17

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

40

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn