From 37fe5071c51619e9807e00dac096ee71dd02b6fe Mon Sep 17 00:00:00 2001 From: Lakhan Samani Date: Sat, 8 Jan 2022 14:08:42 +0530 Subject: [PATCH] Use gomail library for sending emails https://github.com/agarwal-nitesh/authorizer/commit/3b881776b54328c7dacfcbc9ca4f5dd2c71d929b --- server/email/email.go | 82 ++++++++----------------------------------- server/go.mod | 2 ++ server/go.sum | 4 +++ server/utils/email.go | 61 ++++++++++++++++++++++---------- 4 files changed, 63 insertions(+), 86 deletions(-) diff --git a/server/email/email.go b/server/email/email.go index 301eb41..5b273f0 100644 --- a/server/email/email.go +++ b/server/email/email.go @@ -1,26 +1,14 @@ package email import ( - "bytes" - "fmt" + "crypto/tls" "log" - "mime/quotedprintable" - "net/smtp" - "strings" + "strconv" "github.com/authorizerdev/authorizer/server/constants" + gomail "gopkg.in/mail.v2" ) -/** - Using: https://github.com/tangingw/go_smtp/blob/master/send_mail.go - For gmail add instruction to enable less security - // https://myaccount.google.com/u/0/lesssecureapps - // https://www.google.com/settings/security/lesssecureapps - // https://stackoverflow.com/questions/19877246/nodemailer-with-gmail-and-nodejs -**/ - -// TODO -> try using gomail.v2 - type Sender struct { User string Password string @@ -30,60 +18,20 @@ func NewSender() Sender { return Sender{User: constants.SMTP_USERNAME, Password: constants.SMTP_PASSWORD} } -func (sender Sender) SendMail(Dest []string, Subject, bodyMessage string) error { - msg := "From: " + constants.SENDER_EMAIL + "\n" + - "To: " + strings.Join(Dest, ",") + "\n" + - "Subject: " + Subject + "\n" + bodyMessage - - err := smtp.SendMail(constants.SMTP_HOST+":"+constants.SMTP_PORT, - smtp.PlainAuth("", sender.User, sender.Password, constants.SMTP_HOST), - constants.SENDER_EMAIL, Dest, []byte(msg)) - if err != nil { +func (sender Sender) SendMail(to []string, Subject, bodyMessage string) error { + m := gomail.NewMessage() + m.SetHeader("From", constants.SENDER_EMAIL) + m.SetHeader("To", to...) + m.SetHeader("Subject", Subject) + m.SetBody("text/html", bodyMessage) + port, _ := strconv.Atoi(constants.SMTP_PORT) + d := gomail.NewDialer(constants.SMTP_HOST, port, constants.SMTP_USERNAME, constants.SMTP_PASSWORD) + if constants.ENV == "development" { + d.TLSConfig = &tls.Config{InsecureSkipVerify: true} + } + if err := d.DialAndSend(m); err != nil { log.Printf("smtp error: %s", err) return err } - return nil } - -func (sender Sender) WriteEmail(dest []string, contentType, subject, bodyMessage string) string { - header := make(map[string]string) - header["From"] = sender.User - - receipient := "" - - for _, user := range dest { - receipient = receipient + user - } - - header["To"] = receipient - header["Subject"] = subject - header["MIME-Version"] = "1.0" - header["Content-Type"] = fmt.Sprintf("%s; charset=\"utf-8\"", contentType) - header["Content-Transfer-Encoding"] = "quoted-printable" - header["Content-Disposition"] = "inline" - - message := "" - - for key, value := range header { - message += fmt.Sprintf("%s: %s\r\n", key, value) - } - - var encodedMessage bytes.Buffer - - finalMessage := quotedprintable.NewWriter(&encodedMessage) - finalMessage.Write([]byte(bodyMessage)) - finalMessage.Close() - - message += "\r\n" + encodedMessage.String() - - return message -} - -func (sender *Sender) WriteHTMLEmail(dest []string, subject, bodyMessage string) string { - return sender.WriteEmail(dest, "text/html", subject, bodyMessage) -} - -func (sender *Sender) WritePlainEmail(dest []string, subject, bodyMessage string) string { - return sender.WriteEmail(dest, "text/plain", subject, bodyMessage) -} diff --git a/server/go.mod b/server/go.mod index 04b55a4..6168c55 100644 --- a/server/go.mod +++ b/server/go.mod @@ -29,6 +29,8 @@ require ( golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.27.1 // indirect + gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect + gopkg.in/mail.v2 v2.3.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gorm.io/driver/mysql v1.2.1 gorm.io/driver/postgres v1.2.3 diff --git a/server/go.sum b/server/go.sum index 8ca7d0a..5f7a7f4 100644 --- a/server/go.sum +++ b/server/go.sum @@ -672,6 +672,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +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/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= @@ -679,6 +681,8 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/mail.v2 v2.3.1 h1:WYFn/oANrAGP2C0dcV6/pbkPzv8yGzqTjPmTeO7qoXk= +gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw= gopkg.in/readline.v1 v1.0.0-20160726135117-62c6fe619375/go.mod h1:lNEQeAhU009zbRxng+XOj5ITVgY24WcbNnQopyfKoYQ= gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI= gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78= diff --git a/server/utils/email.go b/server/utils/email.go index 29c1ebc..8b77f98 100644 --- a/server/utils/email.go +++ b/server/utils/email.go @@ -1,7 +1,9 @@ package utils import ( - "fmt" + "bytes" + "encoding/json" + "html/template" "github.com/authorizerdev/authorizer/server/constants" "github.com/authorizerdev/authorizer/server/email" @@ -15,10 +17,9 @@ func SendVerificationMail(toEmail, token string) error { Receiver := []string{toEmail} Subject := "Please verify your email" - message := fmt.Sprintf(` + message := ` - @@ -41,7 +42,6 @@ func SendVerificationMail(toEmail, token string) error { -
-