邮件发送

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)
}
&lt;a href="<%= awesomePath() %>">Click here&lt;/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 实现:

本作品采用《CC 协议》,转载必须注明作者和本文链接
caoayu
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!