all repos

onasty @ fdbf2f4

a one-time notes service

onasty/mailer/mailgun.go (view raw)

Smirnov Oleksandr Smirnov Oleksandr
ss2316544@gmail.com
feat: mailer service (#55)..., 1 year ago
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
}