2019-08-02 15:03:32 -08:00
|
|
|
package notify
|
|
|
|
|
2019-08-14 12:53:40 -08:00
|
|
|
/*
|
|
|
|
// Alternative to use AWS SES with SMTP
|
|
|
|
import "gopkg.in/gomail.v2"
|
|
|
|
|
|
|
|
var cfg struct {
|
|
|
|
...
|
|
|
|
SMTP struct {
|
|
|
|
Host string `default:"localhost" envconfig:"HOST"`
|
|
|
|
Port int `default:"25" envconfig:"PORT"`
|
|
|
|
User string `default:"" envconfig:"USER"`
|
|
|
|
Pass string `default:"" envconfig:"PASS" json:"-"` // don't print
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
d := gomail.Dialer{
|
|
|
|
Host: cfg.SMTP.Host,
|
|
|
|
Port: cfg.SMTP.Port,
|
|
|
|
Username: cfg.SMTP.User,
|
|
|
|
Password: cfg.SMTP.Pass}
|
|
|
|
notifyEmail, err = notify.NewEmailSmtp(d, cfg.Service.SharedTemplateDir, cfg.Service.EmailSender)
|
2019-08-14 17:59:47 -08:00
|
|
|
*/
|
2019-08-14 12:53:40 -08:00
|
|
|
|
2019-08-02 15:03:32 -08:00
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
"gopkg.in/gomail.v2"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
)
|
|
|
|
|
|
|
|
// EmailAws defines the data needed to send an email with AWS SES.
|
|
|
|
type EmailSmtp struct {
|
|
|
|
dialer gomail.Dialer
|
|
|
|
senderEmailAddress string
|
|
|
|
templateDir string
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewEmailSmtp creates an implementation of the Email interface used to send email with SMTP.
|
|
|
|
func NewEmailSmtp(dialer gomail.Dialer, sharedTemplateDir, senderEmailAddress string) (*EmailSmtp, error) {
|
|
|
|
|
|
|
|
if senderEmailAddress == "" {
|
|
|
|
return nil, errors.New("Sender email address is required.")
|
|
|
|
}
|
|
|
|
|
|
|
|
templateDir := filepath.Join(sharedTemplateDir, "emails")
|
|
|
|
if _, err := os.Stat(templateDir); os.IsNotExist(err) {
|
|
|
|
return nil, errors.WithMessage(err, "Email template directory does not exist.")
|
|
|
|
}
|
|
|
|
|
|
|
|
return &EmailSmtp{
|
|
|
|
dialer: dialer,
|
|
|
|
templateDir: templateDir,
|
|
|
|
senderEmailAddress: senderEmailAddress,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Verify ensures the provider works.
|
|
|
|
func (n *EmailSmtp) Verify() error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Send initials the delivery of an email the provided email address.
|
|
|
|
func (n *EmailSmtp) Send(ctx context.Context, toEmail, subject, templateName string, data map[string]interface{}) error {
|
|
|
|
|
|
|
|
htmlDat, txtDat, err := parseEmailTemplates(n.templateDir, templateName, data)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
m := gomail.NewMessage()
|
|
|
|
m.SetHeader("From", n.senderEmailAddress)
|
|
|
|
m.SetHeader("To", toEmail)
|
|
|
|
m.SetHeader("Subject", subject)
|
|
|
|
|
|
|
|
m.SetBody("text/plain", string(txtDat))
|
|
|
|
if err := n.dialer.DialAndSend(m); err != nil {
|
|
|
|
return errors.WithStack(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
m.SetBody("text/html", string(htmlDat))
|
|
|
|
if err := n.dialer.DialAndSend(m); err != nil {
|
|
|
|
return errors.WithStack(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|