rano/mailer/mailer.go
Ankit Patial 26a00c9f7c working on auth.
mailer, basic setup with html template and a dev treansport
2024-11-15 21:42:15 +05:30

73 lines
1.5 KiB
Go

package mailer
import (
"errors"
"net/mail"
"gitserver.in/patialtech/rano/config"
)
type (
transporter interface {
send(*message) error
}
Recipients struct {
To []mail.Address `json:"to"`
Cc []mail.Address `json:"cc"`
Bcc []mail.Address `json:"bcc"`
}
message struct {
From string `json:"from" validate:"required"`
Recipients Recipients `json:"recipients" validate:"required"`
Subject string `json:"subject" validate:"required"`
HtmlBody string `json:"htmlBody" validate:"required"`
ReplyTo *mail.Address `json:"replyTo"`
}
Template interface {
Subject() string
HtmlBody() (string, error)
}
)
func Send(to []mail.Address, tpl Template) error {
return send(Recipients{To: to}, tpl)
}
func SendCC(subject string, to, cc []mail.Address, tpl Template) error {
return send(Recipients{To: to, Cc: cc}, tpl)
}
func send(recipients Recipients, tpl Template) error {
if tpl == nil {
return errors.New("mailer: email template is nil")
}
if len(recipients.To) == 0 {
return errors.New("mailer: no recipient found")
}
// TODO remove recepient with bounce hiostory
body, err := tpl.HtmlBody()
if err != nil {
return err
}
// get ENV based transporter and send mail
return getTransporter().send(&message{
From: config.Read().MailerFrom,
Recipients: recipients,
Subject: tpl.Subject(),
HtmlBody: body,
})
}
func getTransporter() transporter {
switch config.AppEnv {
default:
return transportDev{}
}
}