
go 使用 net/smtp 发送 html 邮件时,若收件端显示原始 html 源码而非渲染效果,通常是因为邮件头中错误设置了 content-type 为 text/plain,需改为 text/html 并确保 mime 头格式规范。
go 使用 net/smtp 发送 html 邮件时,若收件端显示原始 html 源码而非渲染效果,通常是因为邮件头中错误设置了 content-type 为 text/plain,需改为 text/html 并确保 mime 头格式规范。
在 Go 中通过 net/smtp 发送 HTML 邮件,关键不在于 HTML 内容本身,而在于邮件协议头(MIME header)的正确声明。许多教程(包括部分 Medium 示例)误将 Content-Type 设为 text/plain,导致邮箱客户端将整个 HTML 字符串当作纯文本处理,从而直接显示 <p>...</p> 等标签,而非渲染为富文本。
✅ 正确做法是:
- 设置
Content-Type: text/html; charset="UTF-8" - 使用
\r\n(而非\n)作为 MIME 头换行符(RFC 5322 强制要求) - 确保头部与正文之间有且仅有一个空行(
\r\n\r\n)
以下是可直接运行的最小可靠示例:
package main
import (
"fmt"
"net/smtp"
"strings"
)
func main() {
from := "sender@example.com"
password := "your-app-password" // 推荐使用应用专用密码
to := []string{"recipient@example.com"}
// HTML 邮件内容
htmlBody := `
<meta charset="UTF-8"><h2>Welcome!</h2>
<p>Hello Louis,</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5806" title="html-deploy"><img
src="https://img.php.cn/upload/skill/000/000/081/179066538882434.jpg" alt="html-deploy" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5806" title="html-deploy" class="overflowclass">html-deploy</a>
<p class="overflowclass">使用 htmlcode.fun 将 HTML 内容或文件部署到网页,适用于用户要求“部署到网页”“托管此 HTML”“生成此前端...的实时链接”等场景。</p>
</div>
<a rel="nofollow" href="/xiazai/skill5806" title="html-deploy" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<p><a href="https://google.com">Confirm your email address</a></p>
`
// 构建 MIME 邮件(注意:必须用 \r\n,且 Content-Type 必须为 text/html)
mimeHeader := make(map[string]string)
mimeHeader["From"] = from
mimeHeader["To"] = strings.Join(to, ", ")
mimeHeader["Subject"] = "HTML Email Test"
mimeHeader["MIME-Version"] = "1.0"
mimeHeader["Content-Type"] = `text/html; charset="UTF-8"`
// 拼接标准 MIME 头(严格遵循 RFC)
header := ""
for key, value := range mimeHeader {
header += fmt.Sprintf("%s: %s\r\n", key, value)
}
header += "\r\n" // 空行分隔 header 和 body
message := []byte(header + htmlBody)
// SMTP 配置(以 Gmail 为例)
auth := smtp.PlainAuth("", from, password, "smtp.gmail.com")
err := smtp.SendMail(
"smtp.gmail.com:587",
auth,
from,
to,
message,
)
if err != nil {
panic(err)
}
fmt.Println("HTML email sent successfully!")
}
⚠️ 注意事项:
-
换行符必须为
\r\n:net/smtp不自动修正,使用\n会导致 MIME 解析失败,多数邮箱(如 Gmail、Outlook)会降级为纯文本显示; -
避免混合 plain/html 多部分(multipart/alternative):初学者建议先用单一部分
text/html,待稳定后再扩展; -
字符编码显式声明:
charset="UTF-8"应与 HTML<meta charset="UTF-8">保持一致,防止中文乱码; - Gmail 等服务商要求启用“两步验证 + 应用专用密码”,不可直接使用账户密码;
- 可通过 Mailtrap 等沙盒服务测试邮件渲染效果,避免误发。
总结:HTML 邮件能否正常渲染,99% 取决于 Content-Type 是否为 text/html 以及 MIME 头格式是否合规。不要复制粘贴未经验证的教程代码——务必检查第 46 行(或类似位置)的 Content-Type 值,并统一使用 \r\n 换行。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










