onasty/mailer/mailgun.go (view raw)
| 1 | package main |
| 2 | |
| 3 | import ( |
| 4 | "context" |
| 5 | "log/slog" |
| 6 | |
| 7 | "github.com/mailgun/mailgun-go/v4" |
| 8 | "github.com/olexsmir/onasty/internal/transport/http/reqid" |
| 9 | ) |
| 10 | |
| 11 | type Mailer interface { |
| 12 | Send(ctx context.Context, to, subject, content string) error |
| 13 | } |
| 14 | |
| 15 | var _ Mailer = (*Mailgun)(nil) |
| 16 | |
| 17 | type Mailgun struct { |
| 18 | from string |
| 19 | |
| 20 | mg *mailgun.MailgunImpl |
| 21 | } |
| 22 | |
| 23 | func NewMailgun(from, domain, apiKey string) *Mailgun { |
| 24 | mg := mailgun.NewMailgun(domain, apiKey) |
| 25 | return &Mailgun{ |
| 26 | from: from, |
| 27 | mg: mg, |
| 28 | } |
| 29 | } |
| 30 | |
| 31 | func (m *Mailgun) Send(ctx context.Context, to, subject, content string) error { |
| 32 | msg := mailgun.NewMessage(m.from, subject, "", to) |
| 33 | msg.SetHTML(content) |
| 34 | |
| 35 | slog.InfoContext(ctx, "email sent", "to", to) |
| 36 | |
| 37 | _, _, err := m.mg.Send(ctx, msg) |
| 38 | if err != nil { |
| 39 | RecordEmailFailed(reqid.GetContext(ctx)) |
| 40 | return err |
| 41 | } |
| 42 | |
| 43 | slog.DebugContext(ctx, "email sent", "subject", subject, "content", content, "err", err) |
| 44 | slog.InfoContext(ctx, "email sent", "to", to) |
| 45 | |
| 46 | RecordEmailSent() |
| 47 | |
| 48 | return nil |
| 49 | } |