Add email service for sending emails

This commit is contained in:
Lucas Schumacher 2024-09-01 11:56:51 -04:00
parent c4e5d3575e
commit 14b3863f8e
4 changed files with 63 additions and 0 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
tmp
*.env

2
go.mod
View File

@ -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
)

4
go.sum
View File

@ -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=

56
models/email.go Normal file
View File

@ -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
}