Buffalo 框架无内置 mailer 命令,不支持 buffalo generate mailer;需手动集成 gomail 等库,自建 app/mailers/ 目录与 Plush 模板,并显式传入 SMTP 配置。

Buffalo 没有内置 mailer 命令
Buffalo 框架本身不提供类似 buffalo generate mailer 的命令。它不像 Rails 那样原生支持邮件模板生成器,也没有默认集成 SMTP 或邮件发送逻辑。如果你在文档或社区里看到相关命令,大概率是混淆了 Buffalo 和其他框架(比如 Rails),或是依赖了第三方插件。
实际发送邮件得靠外部库 + 手动组织结构
Buffalo 项目中发邮件,主流做法是用 gomail、mailgun-go 或 nodemailer(Node.js 子进程调用)这类库,然后自己建目录管理模板。常见路径是:
-
app/mailers/(自建,非 Buffalo 自动生成) -
templates/mailers/welcome.html.plush(用 Plush 渲染 HTML 邮件) -
mailers/welcome_mailer.go(封装SendWelcomeEmail()方法)
注意:plush 模板里不能直接调用 Go 的 net/smtp,得把数据传给纯 Go 发送函数;否则会遇到 template: cannot call function 错误。
为什么不用 Buffalo CLI 生成?
因为 Buffalo 的 generate 子命令只覆盖基础 CRUD 和资源骨架(如 buffalo generate resource user),不处理邮件层。它的设计哲学是「路由和渲染归框架,I/O 和集成归你」。这意味着:
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
- SMTP 配置必须手动写进
app.go或env变量里 - 没有
MailerTest测试桩,得自己 mockgomail.Dialer - 模板变量作用域受限——Plush 不自动继承
context里的 SMTP 配置,需显式传入
一个最小可用的发送逻辑示例:
func SendWelcomeEmail(to string, name string) error {
d := gomail.NewDialer("smtp.gmail.com", 587, "user@gmail.com", "app-pass")
m := gomail.NewMessage()
m.SetHeader("From", "noreply@myapp.com")
m.SetHeader("To", to)
m.SetHeader("Subject", "Welcome!")
m.Embed("templates/mailers/welcome.png") // 如果有图
m.SetBody("text/html", renderTemplate("welcome.html.plush", map[string]interface{}{"Name": name}))
return d.DialAndSend(m)
}
替代方案:用 BillionMail 自托管 + Buffalo 调 API
如果你真需要“快速生成+发送”,更现实的路径是绕过 Buffalo 的 Go 层,改用已开箱支持模板管理的系统。比如 BillionMail 提供 REST API 和 Web UI,你可以:
- 用
curl或http.Client向http://localhost:3000/api/v1/sendPOST 邮件内容 - 在 BillionMail 后台提前建好
welcome模板,Buffalo 只负责传参 - 避免重复实现队列、重试、退订链接、打开追踪等复杂逻辑
真正卡住人的从来不是“怎么写一封邮件”,而是“怎么确保它被送达、不进垃圾箱、能追踪效果”。Buffalo 不解决后者,也不该解决。










