56 lines
1.1 KiB
Go
56 lines
1.1 KiB
Go
package service
|
|
|
|
import (
|
|
"fmt"
|
|
"net/smtp"
|
|
"spend-sparrow/internal/log"
|
|
"spend-sparrow/internal/types"
|
|
)
|
|
|
|
type Mail interface {
|
|
// Sending an email is a fire and forget operation. Thus no error handling
|
|
SendMail(to string, subject string, message string)
|
|
}
|
|
|
|
type MailImpl struct {
|
|
server *types.Settings
|
|
}
|
|
|
|
func NewMail(server *types.Settings) MailImpl {
|
|
return MailImpl{server: server}
|
|
}
|
|
|
|
func (m MailImpl) SendMail(to string, subject string, message string) {
|
|
go m.internalSendMail(to, subject, message)
|
|
}
|
|
|
|
func (m MailImpl) internalSendMail(to string, subject string, message string) {
|
|
if m.server.Smtp == nil {
|
|
return
|
|
}
|
|
|
|
s := m.server.Smtp
|
|
|
|
auth := smtp.PlainAuth("", s.User, s.Pass, s.Host)
|
|
|
|
msg := fmt.Sprintf(
|
|
`From: %v <%v>
|
|
To: %v
|
|
Subject: %v
|
|
MIME-version: 1.0;
|
|
Content-Type: text/html; charset="UTF-8";
|
|
|
|
%v`,
|
|
s.FromName,
|
|
s.FromMail,
|
|
to,
|
|
subject,
|
|
message)
|
|
|
|
log.L.Info("sending mail", "to", to)
|
|
err := smtp.SendMail(s.Host+":"+s.Port, auth, s.FromMail, []string{to}, []byte(msg))
|
|
if err != nil {
|
|
log.L.Error("Error sending mail", "err", err)
|
|
}
|
|
}
|