Buffalo 中启用纯文本邮件发送需手动集成 gomail 等第三方库,因 Buffalo 仅提供模板生成工具 buffalo mail 和空 mail 包占位,不内置 SMTP 发送能力;必须在 actions/mail.go 中自行实现 SendPlainEmail 函数,调用 gomail.NewDialer 和 m.SetBody("text/plain", body) 发送,配置从环境变量读取,不可依赖 c.Mail() 或自动渲染 .plush.txt 模板。

Buffalo 中如何启用纯文本邮件发送
Buffalo 默认不内置邮件发送能力,必须通过第三方库(如 gomail 或 mailgun-go)手动集成;它只提供一个轻量的 mail 包占位接口,但实际发送逻辑需你完全控制。
为什么不能直接用 buffalo mail 命令发纯文本
buffalo mail 是一个生成模板文件的 CLI 工具,不是邮件发送器。它会创建 templates/mail/xxx.plush.html 和配套的 .plush.txt 模板,但这些模板不会自动渲染、不会连接 SMTP、也不会调用发送函数——只是静态文件。
- 运行
buffalo g mail welcome只是生成两个模板文件,不注册任何发送逻辑 -
actions/mail.go里默认没有SendWelcomeEmail实现,需要你手写 - 框架不提供
SMTPClient或配置加载,config/env.yml里也没有 mail 相关字段
手动集成 gomail 发纯文本邮件的最小可行步骤
推荐使用 gomail(轻量、无依赖、支持纯文本+HTML 双模式),关键是要绕过 Buffalo 的 mail stub,自己构造消息体。
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
- 安装:运行
go get gopkg.in/gomail.v2 - 在
actions/mail.go中写发送函数,不要依赖buffalo.Context的c.Mail()(它不可用) - 纯文本内容直接传入
m.SetBody("text/plain", "Hello, world!"),不调用Plush渲染也可 - SMTP 配置建议从环境变量读取:
os.Getenv("SMTP_HOST")、os.Getenv("SMTP_PORT")等,避免硬编码 - 注意:如果同时发 HTML 和文本,
gomail会自动设为 multipart/alternative;只设SetBody("text/plain", ...)就是纯文本邮件
示例片段:
func SendPlainEmail(to, subject, body string) error {
d := gomail.NewDialer(
os.Getenv("SMTP_HOST"),
strconv.Atoi(os.Getenv("SMTP_PORT")),
os.Getenv("SMTP_USER"),
os.Getenv("SMTP_PASS"),
)
m := gomail.NewMessage()
m.SetHeader("From", os.Getenv("SMTP_FROM"))
m.SetHeader("To", to)
m.SetHeader("Subject", subject)
m.SetBody("text/plain", body) // ← 关键:这里就是纯文本
return d.DialAndSend(m)
}
容易被忽略的坑:模板渲染 + 纯文本 + 环境隔离
如果你确实想用 .plush.txt 模板(比如带变量的欢迎信),注意 Buffalo 的 r.Plush 不会自动识别 .txt 后缀——它默认只认 .html。你得手动加载并渲染:
- 用
buffalo.PlushRenderer加载模板路径:r := app.NewRenderer(...),然后r.HTML("mail/welcome.plush.txt")会失败,必须改用r.String("mail/welcome.plush.txt", data) -
r.String返回的是string,不是error,需自行处理空值或 panic - 开发环境和生产环境的 SMTP 配置要严格分离,
.env文件里别漏掉SMTP_*变量,否则本地测试时会静默失败
纯文本邮件看似简单,但 Buffalo 把“模板”和“发送”彻底解耦了——你得自己把两段逻辑粘起来,而且没默认错误日志,出问题时容易卡在静默丢信上。

















