all repos

onasty @ cc720f38bad43254ad76d5e30d8405b965b58ccf

a one-time notes service

onasty/internal/mailer/mailgun.go (view raw)

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