0

0

Go语言实现邮件发送功能_Golang通知系统实战

P粉602998670

P粉602998670

发布时间:2026-01-22 08:27:11

|

355人浏览过

|

来源于php中文网

原创

常见原因是smtp服务端拒绝未认证或未加密连接,需用plainauth显式认证、选587/465端口、qq邮箱用授权码、gmail用应用专用密码。

go语言实现邮件发送功能_golang通知系统实战

为什么 net/smtp 发不出邮件却没报错?

常见现象是调用 smtp.SendMail 返回 nil 错误,但收件人根本没收到——这通常不是代码问题,而是 SMTP 服务端拒绝了未认证或未加密的连接。Gmail、Outlook、QQ 邮箱等主流服务商默认禁用不带身份验证的明文 SMTP(端口 25),也拒绝未启用 TLS 的连接。

  • 必须使用 auth := smtp.PlainAuth("", user, password, host) 显式传入认证凭据
  • 优先选端口 587(STARTTLS)或 465(SMTPS),避免用 25
  • 若用 QQ 邮箱,user 必须是完整邮箱地址(如 "xxx@qq.com"),密码需填「SMTP 授权码」而非登录密码
  • Gmail 要求开启「两步验证」并生成应用专用密码;否则会返回 535 5.7.8 Username and Password not accepted

如何构造带 HTML 内容和附件的 multipart 邮件?

Go 标准库没有开箱即用的 MIME 构建器,得手动拼装 multipart/mixedmultipart/alternative 结构。关键在于边界(boundary)一致、头部顺序正确、正文编码合规。

  • mime/multipart 创建 Writer,调用 w.WriteField("To", "...") 设置基础头字段
  • 先写 multipart/alternative 子部分(含纯文本 text/plain 和 HTML text/html),再写附件部分
  • HTML 正文必须用 base64 编码,并声明 Content-Transfer-Encoding: base64
  • 附件文件名含中文时,要用 mime.BEncoding.Encode("UTF-8", "简历.pdf") 编码,否则 Outlook 会显示乱码
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
writer.SetBoundary("myboundary123")

// HTML 部分
part, _ := writer.CreatePart(map[string][]string{
	"Content-Type": {"text/html; charset=UTF-8"},
	"Content-Transfer-Encoding": {"base64"},
})
base64.NewEncoder(base64.StdEncoding, part).Write([]byte(`<h1>你好</h1>`))

// 附件
part, _ = writer.CreatePart(map[string][]string{
	"Content-Type": {"application/pdf"},
	"Content-Disposition": {`attachment; filename*=UTF-8''%E7%AE%80%E5%8E%86.pdf`},
})
io.Copy(part, file)

writer.Close()

发送失败时怎么快速定位是网络、认证还是内容问题?

错误信息常被忽略,但 smtp.SendMail 返回的 error 值里包含原始 SMTP 状态码和服务器提示,是第一手线索。

情感家园企业站5.0 多语言多风格版
情感家园企业站5.0 多语言多风格版

一套面向小企业用户的企业网站程序!功能简单,操作简单。实现了小企业网站的很多实用的功能,如文章新闻模块、图片展示、产品列表以及小型的下载功能,还同时增加了邮件订阅等相应模块。公告,友情链接等这些通用功能本程序也同样都集成了!同时本程序引入了模块功能,只要在系统默认模板上创建模块,可以在任何一个语言环境(或任意风格)的适当位置进行使用!

下载
  • 捕获错误后,先检查是否为 *textproto.Error 类型:if e, ok := err.(*textproto.Error); ok { fmt.Println(e.Code, e.Msg) }
  • 421 表示服务不可用(DNS 解析失败或目标主机拒连);454 是 TLS 启动失败;535 是认证失败;554 多为内容被判定为垃圾邮件
  • 本地测试可用 telnet smtp.qq.com 587 手动走一遍 EHLO → AUTH → MAIL FROM 流程,确认基础连通性
  • 若日志中反复出现 550 Mail from ... not allowed,说明发信域名未配置 SPF 或 DKIM,需在 DNS 添加记录

生产环境要不要自己搭 SMTP 中继?

直接调用第三方 SMTP(如 SendGrid、Mailgun、腾讯云 SES)比自建更可靠,尤其对通知类高频小邮件。

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

  • 自建 Postfix + OpenDKIM 虽可控,但维护成本高:IP 被拉黑、HELO 域名不匹配、反向 DNS 缺失都会导致投递失败
  • 云服务提供 Webhook 回调、发送统计、退订管理,还能自动降级(如邮件失败时 fallback 到企业微信
  • 若必须自建,至少保证:出站 IP 有固定公网地址、PTR 记录与 HELO 域名一致、每天发信量控制在 100 封以内防进垃圾箱
  • Go 客户端对接云服务时,别硬编码 API Key,用 os.Getenv("MAILGUN_API_KEY") + .env 文件管理
实际最难的不是发出去,是让收件方的 Gmail 不把它扔进推广栏——这取决于发信域名信誉、内容文本比例、链接数量,还有你有没有在 HTML 里偷偷加 display:none 的关键词。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

492

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

377

2023.10.25

Go中Type关键字的用法
Go中Type关键字的用法

Go中Type关键字的用法有定义新的类型别名或者创建新的结构体类型。本专题为大家提供Go相关的文章、下载、课程内容,供大家免费下载体验。

238

2023.09.06

go怎么实现链表
go怎么实现链表

go通过定义一个节点结构体、定义一个链表结构体、定义一些方法来操作链表、实现一个方法来删除链表中的一个节点和实现一个方法来打印链表中的所有节点的方法实现链表。

462

2023.09.25

go语言编程软件有哪些
go语言编程软件有哪些

go语言编程软件有Go编译器、Go开发环境、Go包管理器、Go测试框架、Go文档生成器、Go代码质量工具和Go性能分析工具等。本专题为大家提供go语言相关的文章、下载、课程内容,供大家免费下载体验。

265

2023.10.13

0基础如何学go语言
0基础如何学go语言

0基础学习Go语言需要分阶段进行,从基础知识到实践项目,逐步深入。php中文网给大家带来了go语言相关的教程以及文章,欢迎大家前来学习。

719

2023.10.26

Go语言实现运算符重载有哪些方法
Go语言实现运算符重载有哪些方法

Go语言不支持运算符重载,但可以通过一些方法来模拟运算符重载的效果。使用函数重载来模拟运算符重载,可以为不同的类型定义不同的函数,以实现类似运算符重载的效果,通过函数重载,可以为不同的类型实现不同的操作。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

196

2024.02.23

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

AngularJS教程
AngularJS教程

共24课时 | 4.1万人学习

CSS教程
CSS教程

共754课时 | 41.6万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号