1
0
mirror of https://github.com/raseels-repos/golang-saas-starter-kit.git synced 2025-06-06 23:46:29 +02:00
2019-08-14 17:59:47 -08:00

89 lines
2.2 KiB
Go

package notify
/*
// 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)
*/
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
}