make Mailer an interface

This commit is contained in:
dhax 2025-03-05 15:42:02 +01:00
parent dd2412463b
commit 08c09ffee7
10 changed files with 234 additions and 227 deletions

63
email/smtp.go Normal file
View file

@ -0,0 +1,63 @@
package email
import (
"github.com/go-mail/mail"
"github.com/spf13/viper"
)
// SMTPMailer is a SMTP mailer.
type SMTPMailer struct {
client *mail.Dialer
from Email
}
// NewMailer returns a configured SMTP Mailer.
func NewMailer() (Mailer, error) {
if err := parseTemplates(); err != nil {
return nil, err
}
smtp := struct {
Host string
Port int
User string
Password string
}{
viper.GetString("email_smtp_host"),
viper.GetInt("email_smtp_port"),
viper.GetString("email_smtp_user"),
viper.GetString("email_smtp_password"),
}
if smtp.Host == "" {
return NewMockMailer(), nil
}
s := &SMTPMailer{
client: mail.NewDialer(smtp.Host, smtp.Port, smtp.User, smtp.Password),
from: NewEmail(viper.GetString("email_from_name"), viper.GetString("email_from_address")),
}
d, err := s.client.Dial()
if err == nil {
d.Close()
return s, nil
}
return nil, err
}
// Send sends the mail via smtp.
func (m *SMTPMailer) Send(email Message) error {
if err := email.parse(); err != nil {
return err
}
msg := mail.NewMessage()
msg.SetAddressHeader("From", email.From.Address, email.From.Name)
msg.SetAddressHeader("To", email.To.Address, email.To.Name)
msg.SetHeader("Subject", email.Subject)
msg.SetBody("text/plain", email.text)
msg.AddAlternative("text/html", email.html)
return m.client.DialAndSend(msg)
}