当前位置:首页 > 文章列表 > Golang > Go教程 > Golang发送邮件教程详解

Golang发送邮件教程详解

2026-04-05 21:21:25 0浏览 收藏
本文深入剖析了Go语言中使用net/smtp发送邮件的核心难点与实战要点:它并非开箱即用的“发邮件函数”,而是一个仅负责SMTP协议传输的底层工具,要求开发者严格遵循RFC 5322和RFC 2046规范手动构造符合标准的邮件字节流——从中文Subject的Base64编码、Content-Type中charset=utf-8的精确写法(不可加引号)、发件人与认证账号的强一致性校验,到587端口的StartTLS配置与465端口必须tls.Dial的差异,再到HTML邮件必须依赖multipart结构而非简单改Content-Type等关键细节,无不揭示“能连上”不等于“能发成功”。文章直击纯文本乱码、HTML显示源码、附件无法嵌入等高频踩坑场景,并明确指出:生产环境应果断放弃手撸MIME,转而采用gomail等成熟封装库来可靠处理多部分消息、双格式回退与附件嵌入;同时强调,真正的障碍往往不在代码,而在各邮箱服务商(Gmail/QQ/163)千差万别的授权机制、端口策略、防火墙限制与错误码含义——调试时telnet连通性测试和精准解读535/452/421等状态码,远比重写邮件头更高效。

Golang怎么发送邮件_Golang邮件发送教程【详解】

net/smtp 能发邮件,但不是“调个函数就发出去”,它只管协议传输,不帮你拼邮件头、不处理 HTML、不封装附件——想发成功,得自己按 RFC 5322 和 RFC 2046 把字节流写对。

怎么用 smtp.SendMail 发纯文本邮件

这是最简路径,适合通知类、日志告警等无格式需求。关键不是写代码,而是构造符合规范的原始邮件字节:FromToSubject 必须有,\r\n 换行不能错,头部和正文之间必须空一行。

  • Subject 中文要 Base64 编码(如 Subject: =?UTF-8?B?5byg5LiJ?=),否则 Outlook 可能显示乱码
  • Content-Type: text/plain; charset=utf-8 头必须显式写,不能省;charset 值里不要加引号("utf-8" 是错的)
  • 发件人地址(from 参数)必须和认证账号完全一致,Gmail/163/QQ 都校验这个,填错直接 530 5.7.0 Sender address rejected
  • 端口选 587 就配 smtp.PlainAuth + StartTLS;选 465 就得用 tls.Dial 直连,smtp.SendMail 不支持自动 SSL 握手

示例片段:

msg := []byte("To: user@example.com\r\n" +
 "From: sender@163.com\r\n" +
 "Subject: =?UTF-8?B?5byg5LiJ?= \r\n" +
 "MIME-Version: 1.0\r\n" +
 "Content-Type: text/plain; charset=utf-8\r\n" +
 "\r\n" +
 "这是一封测试邮件。")

为什么发 HTML 邮件总显示源码

因为 net/smtp 完全不管 MIME 结构——你直接把

Hello

当正文塞进去,它就真当纯文本发了,收件箱自然渲染不出标题。HTML 邮件本质是 multipart/mixed 或 multipart/alternative 消息体,含 boundary、headers、text/html part 等,标准库不封装这些。

  • 手动构造太容易出错:boundary 写错、part 缺 Content-Type\r\n 混成 \n,都会导致 Gmail 显示为源码或拒收
  • 内联样式必须用 style="..." 行内写,
    微信登录更方便
    • 密码登录
    • 注册账号
    登录即同意 用户协议隐私政策
    返回登录
    • 重置密码