go标准库不支持直接发邮件,推荐使用gomail——轻量、文档清晰、维护活跃的smtp封装,自动处理mime、编码、附件等;net/smtp仅适合调试或学习协议。

Go 标准库不支持直接发邮件,必须用第三方包(比如 net/smtp 配合手动构造 MIME),但真正稳定可用的方案是 gomail 或 mailgun-go —— 除非你明确需要自定义 SMTP 流程或对接特定邮件服务 API。
用 gomail 发纯文本/HTML 邮件最省事
这是目前最轻量、文档清晰、维护活跃的通用 SMTP 封装。它自动处理 MIME、编码、附件、多收件人,不用自己拼 Content-Type 头或 Base64。
- 安装:
go get gopkg.in/gomail.v2(注意 v2 是主流版本,v3 已废弃) - 基本发送只需 4 步:创建
gomail.Message→ 设置发件人/收件人/主题 → 添加正文(SetBody)→ 调用Send传入 SMTP 地址和认证 - 发 HTML 邮件?把
"text/plain"换成"text/html"即可;要同时发纯文本 + HTML(让客户端自动选)?用AddAlternative - 常见报错
dial tcp: lookup smtp.gmail.com: no such host多因 DNS 不通或代理干扰;535 5.7.8 Username and Password not accepted则大概率是 Gmail 关闭了“低安全性应用访问”,得开 App Password 或换企业邮箱
用 net/smtp 手动发邮件只适合调试或极简场景
标准库 net/smtp 只提供底层 SMTP 会话能力,不处理邮件结构。你要自己写 RFC 2822 格式的完整邮件体,包括 Date、From、To、MIME-Version、Content-Type 等头字段,稍有格式错误就会被拒收或进垃圾箱。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 适用情况:临时脚本发告警、CI 中触发通知、学习 SMTP 协议流程
- 关键点:
smtp.Auth必须用smtp.PlainAuth(Gmail/Outlook/腾讯企业邮都支持),且用户名通常是完整邮箱地址(如"user@gmail.com"),不是昵称 - 别漏掉
\r\n换行 —— MIME 头与正文之间必须有两个\r\n,否则服务器解析失败;正文内容若含中文,需用base64编码并声明Content-Transfer-Encoding: base64 - 示例片段:
msg := []byte("To: to@example.com\r\nFrom: from@example.com\r\nSubject: hello\r\nMIME-Version: 1.0\r\nContent-Type: text/plain; charset=utf-8\r\n\r\nHello, 世界")
Gmail / Outlook / 国内企业邮箱的配置差异
不同服务商对 SMTP 端口、加密方式、认证要求不一致,硬套一个配置容易连不上。
- Gmail:必须开启两步验证 + 生成 App Password,用
smtp.gmail.com:587+TLS(非 SSL);gmail.com域名下禁用普通密码登录 - Outlook/Hotmail:用
smtp-mail.outlook.com:587,同样走 STARTTLS,账号填完整邮箱,密码是账户密码(非 App Password) - 腾讯企业邮箱:SMTP 地址是
smtp.exmail.qq.com,端口465(SSL)或587(TLS),需在管理后台开启 SMTP 服务并获取独立密码(非微信/网页登录密码) - 阿里云邮件推送(DirectMail):不走 SMTP,要用
alibabacloud-sdk-go调 REST API,AccessKey+SecretKey认证,模板必须先审核通过
真正麻烦的不是代码怎么写,而是每家邮件服务商的权限开关藏得深、错误提示模糊、DNS 和防火墙还可能中途拦截。建议第一次跑通前,先用 Thunderbird 或 Outlook 手动配一遍 SMTP 参数,确认能发出去,再照搬进 Go 代码里。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










