直接用 text/template 即可,需注意数据结构、转义和错误处理:加载用 template.Must(template.ParseFiles("email.txt")),渲染用 t.Execute(&buf, data) 并检查 error;HTML 内容需用 template.HTML 类型配合 safeHTML;复用片段用 {{define}} 和 {{template}};多文件用 ParseGlob;发送前校验换行符、CSS 兼容性、UTF-8 编码及字段导出。
直接用就行,不用额外依赖,但必须注意数据结构、转义和错误处理——否则发出去的邮件里全是或者 HTML 标签被当成纯文本显示。
怎么加载并执行一个简单的邮件模板
模板文件(比如
)写成纯文本或 HTML 都可以,
本身不区分格式,只管替换变量:
Go 代码里加载并渲染:
用
加载,它会在解析失败时 panic,适合启动时加载
调用
渲染,
必须是 map、struct 或支持字段访问的类型
别忘了检查
的返回 error——空字段、类型不匹配、嵌套 nil 都会在这里报错,不是编译期问题
为什么邮件里 HTML 标签没渲染,反而显示成 Hello
因为
默认对所有输出做 HTML 转义,防止 XSS。但邮件正文如果是 HTML 格式,你并不想让
变成
立即学习
“
go语言免费学习笔记(深入)
”;
用
显式标记可信内容(前提是
是
类型)
或者把模板变量定义为
类型:比如
千万别用
去“手动解码”转义后的字符串——这会破坏其他本该转义的内容,比如用户昵称里的
如何复用模板片段(比如邮件头部/尾部)
用
和
实现模块化,比拼接字符串更可靠:
会自动识别所有
块,无需单独注册
中的
表示把当前作用域数据传给子模板;如果子模板需要不同结构,就传具体字段:
(需配合
注入
函数)
多个模板文件用
一次性加载,避免漏掉
发送前必须校验的三个细节
模板能跑通 ≠ 邮件能正常显示:
换行符用
还是
?纯文本邮件靠 \n 换行,HTML 邮件靠
;别在 text/plain 部分写 HTML 标签
Gmail 等客户端会过滤 inline CSS,
可能失效,优先用内联
或纯文本方案
中文字符、emoji 在 SMTP 发送前要确认
头设为
,否则变成乱码——这个不在 template 控制范围内,是邮件库(如
)的配置项
最常被跳过的其实是错误路径:模板字段名写错、结构体字段未导出(首字母小写)、嵌套 map 键不存在——这些不会编译报错,但
会返回 error 并留空字段。线上环境务必 log 这个 error,而不是只打印 “send ok”。
text/template{{.Name}}email.txttext/templateHi {{.Name}},
Your order #{{.OrderID}} has been shipped.
Tracking: {{.TrackingCode}}template.Must(template.ParseFiles("email.txt"))t.Execute(&buf, data)dataExecutetext/template<。{{.HTMLBody | safeHTML}}.HTMLBodytemplate.HTMLtemplate.HTMLdata := struct{ Body template.HTML }{Body: template.HTML(`Hello`)}strings.ReplaceAll{{define}}{{template}}{{define "header"}}Welcome!
{{end}}
{{define "footer"}}© {{.Year}} Company
{{end}}
{{template "header"}}
Hi {{.Name}}...
{{template "footer" .}}template.ParseFilesdefine{{template "name" .}}.{{template "footer" dict "Year" 2024}}template.FuncMapdictParseGlob("templates/*.txt")define\n
style="color:red"Content-Typetext/html; charset=utf-8gomailExecute