Buffalo框架不内置邮件发送能力,需集成gomail等第三方库并手动配置SMTP;mailer命令仅生成模板骨架,无Send实现和传输逻辑,须自行编码实现异步发送、错误日志及开发环境禁用真实发送。

Buffalo 框架本身不内置邮件发送能力,必须集成第三方库(如 gomail 或 mailgun-go)并手动配置 SMTP 或 API;直接调用 buffalo mailer 命令生成的模板只是骨架,不带传输逻辑。
Buffalo 的 mailer 命令只生成模板和占位文件
运行 buffalo generate mailer WelcomeEmail 后,你会得到:mailers/welcome_email.go(空结构体)、templates/mailers/welcome_email.html(HTML 模板)、templates/mailers/welcome_email.plain(纯文本模板)。但这些文件里没有 Send() 实现,也没有 SMTP 配置加载逻辑——它只是约定目录结构,不是开箱即用的邮件服务。
- 模板中用
{{.User.Name}}这类语法取值,但数据需由你显式传入mailers.Render调用 -
mailers.Render返回的是bytes.Buffer,不是已发送的邮件 - 若未手动引入发送库,
go run会报undefined: gomail类错误
用 gomail 实现 SMTP 发送(推荐轻量场景)
gomail 简单直接,适合开发/测试环境或中小项目。关键点是:不能在 mailers/*.go 中硬编码 SMTP 凭据,应从 env 或 actions/app.go 加载配置。
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
- 在
mailers/welcome_email.go的Send方法里,先调用mailers.Render获取 HTML 和 plain 内容 - 构造
gomail.Message,用SetHeader("From", "no-reply@yourapp.com")显式设发件人(Gmail 等要求发件人与登录账号一致) - 使用
gomail.NewDialer时,端口要匹配服务商:Gmail 用587(STARTTLS),Outlook 用587,自建 Postfix 常用25或465(SSL) - 密码必须是应用专用密码(如 Gmail 开启两步验证后生成),不能直接填邮箱登录密码
func (m *WelcomeEmail) Send(to string, user User) error {
htmlBody, _ := mailers.Render("mailers/welcome_email.html", m, user)
plainBody, _ := mailers.Render("mailers/welcome_email.plain", m, user)
msg := gomail.NewMessage()
msg.SetHeader("From", "no-reply@example.com")
msg.SetHeader("To", to)
msg.SetHeader("Subject", "Welcome!")
msg.SetBody("text/plain", plainBody.String())
msg.AddAlternative("text/html", htmlBody.String())
d := gomail.NewDialer("smtp.gmail.com", 587, "you@gmail.com", "app-password-here")
return d.DialAndSend(msg)
}
避免在 actions 层直接调用邮件发送
在 actions/users.go 的 Create 处理函数里写 welcomeEmail.Send(...) 是常见反模式:HTTP 请求响应周期内执行发送会阻塞、超时风险高,且失败时难追溯。
- 改用异步方式:启动 goroutine(仅限低频、非关键通知)或接入消息队列(如
redis+asynq) - 必须加错误日志:SMTP 连接失败、认证失败、收件人格式错误等都应记录
log.Error,否则邮件静默丢失 - 开发时禁用真实发送:通过
ENV=development判断,把邮件内容写入/tmp/last-email.html替代实际发送 - 别忽略
Content-Type和字符编码:HTML 模板开头加<meta charset="UTF-8">,msg.SetBody前确保bytes.Buffer是 UTF-8 编码
真正麻烦的从来不是写几行 gomail.Send,而是 SMTP 认证绕过、退信处理、发送频率限制、模板变量作用域混乱——这些不会出现在 Buffalo 文档首页,但上线第一天就会撞上。

















