電子郵件是大多數(網路)系統的一部分。 這是通知使用者平臺新聞、確認資訊、營銷資訊等資訊的標準方式。
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 協議》,轉載必須註明作者和本文連結