0

0

如何在Golang中实现简单的邮件发送客户端 Go语言SMTP协议实战

P粉602998670

P粉602998670

发布时间:2026-03-12 04:23:16

|

854人浏览过

|

来源于php中文网

原创

用 net/smtp 发邮件前必须配对的 3 个东西:smtp 服务器地址(如 "smtp.gmail.com:587")、有发信权限的邮箱账号及应用专用密码、符合 rfc 格式的邮件头与正文(含正确换行和编码)。

如何在golang中实现简单的邮件发送客户端 go语言smtp协议实战

net/smtp 发邮件前必须配对的 3 个东西

Go 自带的 net/smtp 不是“调个函数就发”,它只管协议层,不处理认证、加密、正文组装这些事。你得自己凑齐:一个能连上的 SMTP 服务器地址(比如 "smtp.gmail.com:587")、一个有发信权限的邮箱账号+密码(或应用专用密码)、以及符合 RFC 格式的邮件头和正文(不是拼字符串那么简单)。

  • Gmail 等主流服务现在基本禁用明文密码登录,必须用应用专用密码(在 Google 账户里开启两步验证后生成),直接填邮箱密码会报 535 5.7.8 Username and Password not accepted
  • 端口别硬记:465 对应 SSL(老式直连),587 对应 TLS(STARTTLS 升级),Go 的 smtp.SendMail 只支持后者;若用 465,得自己建 tls.Conn 再传给 smtp.Client
  • 邮件正文必须带 Content-Type\r\n\r\n 分隔头与体,少一个换行就可能被当垃圾邮件或直接拒收

smtp.Auth 选哪个?smtp.PlainAuth 够用但有前提

smtp.PlainAuth 是最常用的选择,但它要求 SMTP 服务器明确声明支持 AUTH PLAIN(看 EHLO 响应里有没有这行)。Gmail、Outlook、腾讯企业邮都支持;但有些内网自建 Postfix 若没开 smtpd_sasl_auth_enable = yes,就会静默失败——连接成功,发信时卡住或返回 503 5.5.1 Error: authentication not enabled

  • 用户名字段填完整邮箱地址(如 "user@gmail.com"),不是昵称或前缀
  • 密码字段填应用专用密码,不是账户密码;如果用的是 QQ 邮箱,注意它要求开启“SMTP服务”且密码是独立生成的授权码
  • 域名参数(第一个参数)可以为空字符串,但不能为 nil;填错成服务器域名(如 "smtp.qq.com")通常不影响,但某些严格实现会校验

构建合法邮件体:别手写 MIME,用 mime/multipart 或至少加好头

直接 fmt.Sprintf("To: %s\r\nSubject: %s\r\n\r\n%s", to, subject, body) 看似简单,实际埋雷:中文 subject 会乱码,附件无法附,HTML 正文不渲染,还容易触发反垃圾规则。最轻量的补救是手动加标准头,但必须严格:

免费语音克隆
免费语音克隆

这是一个提供免费语音克隆服务的平台,用户只需上传或录制一段 5 秒以上的清晰语音样本,平台即可生成与用户声音高度一致的 AI 语音克隆。

下载
From: <sender@example.com>
To: <receiver@example.com>
Subject: =?UTF-8?B?5byg5LiJ?=  // Base64 编码的中文主题
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

SGVsbG8gd29ybGQh  // "Hello world!" 的 base64
  • 所有头字段名首字母大写,冒号后空一格,结尾用 \r\n(不是 \n
  • 头与体之间必须是 \r\n\r\n,多一个或少一个字符都会让服务器解析失败
  • 如果要发 HTML 邮件,Content-Type 改成 text/html; charset=UTF-8,且确保 HTML 标签闭合、无 JS

超时和错误处理:别让 goroutine 卡死在 SendMail

smtp.SendMail 是阻塞调用,DNS 解析慢、网络抖动、服务器响应延迟都会导致它卡住几十秒。线上服务不设超时等于给自己埋定时炸弹。

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

  • context.WithTimeout 包一层:传给 smtp.SendMailnet.Conn 必须是带 deadline 的,所以得自己 dial 并设 SetDeadline,不能依赖 SendMail 内部逻辑
  • 常见错误不要只打 err.Error()554 5.7.1 Message rejected due to content restrictions 是内容被拦,421 4.7.0 Try again later 是发太快被限频,得区分日志级别
  • 别在循环里反复重试失败邮箱——Gmail 对单 IP 每分钟发信数有限制,连续错 3 次可能进临时黑名单

真正麻烦的从来不是“怎么发”,而是“发之前谁验证了邮箱格式、发之后谁确认对方收到了、失败时谁通知运维”。SMTP 本身没回调、没回执、没送达保证,这些得自己在业务层兜底。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

210

2024.02.23

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

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

247

2024.02.23

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

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

356

2024.02.23

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

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

214

2024.03.05

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

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

409

2024.05.21

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

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

490

2025.06.09

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

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

201

2025.06.10

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

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

1438

2025.06.17

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

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

精品课程

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

共32课时 | 6.1万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.9万人学习

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

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