From 14b3863f8e5037e0fb83f1c4498e2cd2c0ec91e0 Mon Sep 17 00:00:00 2001 From: Lucas Schumacher Date: Sun, 1 Sep 2024 11:56:51 -0400 Subject: [PATCH] Add email service for sending emails --- .gitignore | 1 + go.mod | 2 ++ go.sum | 4 ++++ models/email.go | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 models/email.go diff --git a/.gitignore b/.gitignore index 1586e95..f72d79f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ tmp +*.env diff --git a/go.mod b/go.mod index c3aa2f6..8149f29 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( ) require ( + github.com/go-mail/mail/v2 v2.3.0 // indirect github.com/gorilla/securecookie v1.1.2 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.14.3 // indirect @@ -24,4 +25,5 @@ require ( go.uber.org/multierr v1.11.0 // indirect golang.org/x/sync v0.8.0 // indirect golang.org/x/text v0.17.0 // indirect + gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect ) diff --git a/go.sum b/go.sum index 2313387..9c38fda 100644 --- a/go.sum +++ b/go.sum @@ -15,6 +15,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-mail/mail/v2 v2.3.0 h1:wha99yf2v3cpUzD1V9ujP404Jbw2uEvs+rBJybkdYcw= +github.com/go-mail/mail/v2 v2.3.0/go.mod h1:oE2UK8qebZAjjV1ZYUpY7FPnbi/kIU53l1dmqPRb4go= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= @@ -203,6 +205,8 @@ golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= +gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= diff --git a/models/email.go b/models/email.go new file mode 100644 index 0000000..e58dfad --- /dev/null +++ b/models/email.go @@ -0,0 +1,56 @@ +package models + +import ( + "fmt" + "os" + + "github.com/go-mail/mail/v2" +) + +var ( + defaultSender = os.Getenv("LENSLOCKED_EMAIL_FROM") +) + +type Email struct { + To string + Subject string + Text string + Html string +} + +type EmailService struct { + DefaultSender string + + dialer *mail.Dialer +} + +func NewEmailService(host string, port int, username, pass, sender string) *EmailService { + es := EmailService{ + dialer: mail.NewDialer(host, port, username, pass), + DefaultSender: sender, + } + return &es +} + +func (es *EmailService) Send(email Email) error { + msg := mail.NewMessage() + + msg.SetHeader("To", email.To) + msg.SetHeader("From", es.DefaultSender) + msg.SetHeader("Subject", email.Subject) + + if email.Html != "" && email.Text != "" { + msg.SetBody("text/plain", email.Text) + msg.AddAlternative("text/html", email.Html) + } else if email.Text != "" { + msg.SetBody("text/plain", email.Text) + } else if email.Html != "" { + msg.SetBody("text/html", email.Html) + } + + err := es.dialer.DialAndSend(msg) + if err != nil { + return fmt.Errorf("send: %w", err) + } + return nil +}