package service import ( "context" "fmt" "log/slog" "net/smtp" "spend-sparrow/internal/types" ) type Mail interface { // Sending an email is a fire and forget operation. Thus no error handling SendMail(ctx context.Context, 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(ctx context.Context, to string, subject string, message string) { go m.internalSendMail(ctx, to, subject, message) } func (m MailImpl) internalSendMail(ctx context.Context, 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) slog.InfoContext(ctx, "sending mail", "to", to) err := smtp.SendMail(s.Host+":"+s.Port, auth, s.FromMail, []string{to}, []byte(msg)) if err != nil { slog.ErrorContext(ctx, "Error sending mail", "err", err) } }