邮件发送
Mailers
电子邮件是大多数(网络)系统的一部分。 这是通知用户平台新闻、确认信息、营销信息等信息的标准方式。
Buffalo
提供了一个具有标准 SMTP
发送器的邮件扩展。 一个生成器包括在内,让您的工作与电子邮件尽可能快。
生成器
$ buffalo generate mailer welcome_email
示例用法
// mailers/mail.go
package x
import (
"log"
"github.com/gobuffalo/buffalo/render"
"github.com/gobuffalo/envy"
"github.com/gobuffalo/packr"
"github.com/gobuffalo/plush"
"github.com/gobuffalo/buffalo/mail"
"github.com/pkg/errors"
"gitlab.com/wawandco/app/models"
)
var smtp mail.Sender
var r *render.Engine
func init() {
// Pulling config from the env.
port := envy.Get("SMTP_PORT", "1025")
host := envy.Get("SMTP_HOST", "localhost")
user := envy.Get("SMTP_USER", "")
password := envy.Get("SMTP_PASSWORD", "")
var err error
smtp, err = mail.NewSMTPSender(host, port, user, password)
if err != nil {
log.Fatal(err)
}
// The rendering engine, this is usually generated inside actions/render.go in your buffalo app.
r = render.New(render.Options{
TemplatesBox: packr.NewBox("../templates"),
})
}
// SendContactMessage Sends contact message to contact@myapp.com
func SendContactMessage(c *models.Contact) error {
// Creates a new message
m := mail.NewMessage()
m.From = "sender@myapp.com"
m.Subject = "New Contact"
m.To = []string{"contact@myapp.com"}
// Data that will be used inside the templates when rendering.
data := map[string]interface{}{
"contact": c,
}
// You can add multiple bodies to the message you're creating to have content-types alternatives.
err := m.AddBodies(data, r.HTML("mail/contact.html"), r.Plain("mail/contact.txt"))
if err != nil {
return errors.WithStack(err)
}
err = smtp.Send(m)
if err != nil {
return errors.WithStack(err)
}
return nil
}
这个 SendContactMessage
可以由您的一个操作调用,即处理您的联系人表单提交的操作。
// actions/contact.go
...
func ContactFormHandler(c buffalo.Context) error {
contact := &models.Contact{}
c.Bind(contact)
// Calling to send the message
SendContactMessage(contact)
return c.Redirect(302, "contact/thanks")
}
...
您可以添加您自己的plush
函数绑定到数据。
func UUIDToString(u uuid.UUID) string {
return fmt.Sprintf("%s", u)
}
m := mail.NewMessage()
...
// Data that will be used inside the templates when rendering.
data := map[string]interface{}{
"contact": c,
"UUIDToString": UUIDToStringHelper,
}
使用上下文变量
从 v0.13.0-rc1开始
要使用诸如 RouteHelpers
之类的上下文变量,或者使用 c. Set (...)
,mail. New
接受 buffalo. Context
。
func SendMail(c buffalo.Context) error {
m := mail.New(c)
...
m.AddBody(r.HTML("mail.html"))
return SMTP.Send(m)
}
<a href="<%= awesomePath() %>">Click here</a>
附加配置
如果您正在使用 Gmail
或需要配置您的 SMTP
连接,您可以使用 SMTPSender
上的 Dialer
属性
// mailers/mail.go
...
var smtp mail.Sender
func init() {
port := envy.Get("SMTP_PORT", "465")
// or 587 with TLS
host := envy.Get("SMTP_HOST", "smtp.gmail.com")
user := envy.Get("SMTP_USER", "your@email.com")
password := envy.Get("SMTP_PASSWORD", "yourp4ssw0rd")
// Assigning to smtp later to preserve type
var err error
sender, err := mail.NewSMTPSender(host, port, user, password)
sender.Dialer.SSL = true
//or if TLS
sender.Dialer.TLSConfig = &tls.Config{...}
smtp = sender
}
...
发送者实现
Buffalo
社区提供了一些替代 Sender
实现:
- postmark-sender - A sender to work with Postmark. Author: @paganotoni.
- mocksmtp - A mock implementation that can be used for testing. Author: @stanislas-m.
- sendgrid-sender - A sender to work with Sendgrid. Author: @paganotoni.
- mailopen - A sender that opens emails in browser. Author: @paganotoni.
本作品采用《CC 协议》,转载必须注明作者和本文链接