2021-07-12 18:22:16 +00:00
|
|
|
package email
|
|
|
|
|
|
|
|
import (
|
2022-01-17 06:02:13 +00:00
|
|
|
"bytes"
|
2022-08-08 20:13:37 +00:00
|
|
|
"context"
|
2022-01-08 08:38:42 +00:00
|
|
|
"crypto/tls"
|
|
|
|
"strconv"
|
2022-01-17 06:02:13 +00:00
|
|
|
"text/template"
|
2021-07-12 18:22:16 +00:00
|
|
|
|
2022-05-23 06:22:51 +00:00
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
gomail "gopkg.in/mail.v2"
|
|
|
|
|
2021-07-23 16:27:44 +00:00
|
|
|
"github.com/authorizerdev/authorizer/server/constants"
|
2022-08-08 20:13:37 +00:00
|
|
|
"github.com/authorizerdev/authorizer/server/db"
|
|
|
|
"github.com/authorizerdev/authorizer/server/graph/model"
|
2022-05-29 11:52:46 +00:00
|
|
|
"github.com/authorizerdev/authorizer/server/memorystore"
|
2021-07-12 18:22:16 +00:00
|
|
|
)
|
|
|
|
|
2022-08-08 20:13:37 +00:00
|
|
|
func getDefaultTemplate(event string) *model.EmailTemplate {
|
|
|
|
switch event {
|
2022-08-13 06:04:24 +00:00
|
|
|
case constants.VerificationTypeBasicAuthSignup, constants.VerificationTypeMagicLinkLogin, constants.VerificationTypeUpdateEmail:
|
2022-08-08 20:13:37 +00:00
|
|
|
return &model.EmailTemplate{
|
|
|
|
Subject: emailVerificationSubject,
|
|
|
|
Template: emailVerificationTemplate,
|
|
|
|
}
|
|
|
|
case constants.VerificationTypeForgotPassword:
|
|
|
|
return &model.EmailTemplate{
|
|
|
|
Subject: forgotPasswordSubject,
|
|
|
|
Template: forgotPasswordTemplate,
|
|
|
|
}
|
|
|
|
case constants.VerificationTypeInviteMember:
|
|
|
|
return &model.EmailTemplate{
|
|
|
|
Subject: inviteEmailSubject,
|
|
|
|
Template: inviteEmailTemplate,
|
|
|
|
}
|
|
|
|
case constants.VerificationTypeOTP:
|
|
|
|
return &model.EmailTemplate{
|
|
|
|
Subject: otpEmailSubject,
|
|
|
|
Template: otpEmailTemplate,
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func getEmailTemplate(event string, data map[string]interface{}) (*model.EmailTemplate, error) {
|
|
|
|
ctx := context.Background()
|
|
|
|
tmp, err := db.Provider.GetEmailTemplateByEventName(ctx, event)
|
|
|
|
if err != nil || tmp == nil {
|
|
|
|
tmp = getDefaultTemplate(event)
|
|
|
|
}
|
|
|
|
|
|
|
|
templ, err := template.New(event + "_template.tmpl").Parse(tmp.Template)
|
2022-01-17 06:02:13 +00:00
|
|
|
if err != nil {
|
2022-08-08 20:13:37 +00:00
|
|
|
return nil, err
|
2022-01-17 06:02:13 +00:00
|
|
|
}
|
|
|
|
buf := &bytes.Buffer{}
|
2022-08-08 20:13:37 +00:00
|
|
|
err = templ.Execute(buf, data)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
templateString := buf.String()
|
|
|
|
|
|
|
|
subject, err := template.New(event + "_subject.tmpl").Parse(tmp.Subject)
|
2022-01-17 06:02:13 +00:00
|
|
|
if err != nil {
|
2022-08-08 20:13:37 +00:00
|
|
|
return nil, err
|
2022-01-17 06:02:13 +00:00
|
|
|
}
|
2022-08-08 20:13:37 +00:00
|
|
|
buf = &bytes.Buffer{}
|
|
|
|
err = subject.Execute(buf, data)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
subjectString := buf.String()
|
|
|
|
|
|
|
|
return &model.EmailTemplate{
|
|
|
|
Template: templateString,
|
|
|
|
Subject: subjectString,
|
|
|
|
}, nil
|
2022-01-17 06:02:13 +00:00
|
|
|
}
|
|
|
|
|
2022-08-08 20:13:37 +00:00
|
|
|
// SendEmail function to send mail
|
|
|
|
func SendEmail(to []string, event string, data map[string]interface{}) error {
|
2022-03-02 12:12:31 +00:00
|
|
|
// dont trigger email sending in case of test
|
2022-05-29 11:52:46 +00:00
|
|
|
envKey, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeyEnv)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2022-06-09 17:43:22 +00:00
|
|
|
if envKey == constants.TestEnv {
|
2022-03-02 12:12:31 +00:00
|
|
|
return nil
|
|
|
|
}
|
2022-08-08 20:13:37 +00:00
|
|
|
|
|
|
|
tmp, err := getEmailTemplate(event, data)
|
|
|
|
if err != nil {
|
|
|
|
log.Errorf("Failed to get event template: ", err)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2022-01-08 08:38:42 +00:00
|
|
|
m := gomail.NewMessage()
|
2022-05-29 11:52:46 +00:00
|
|
|
senderEmail, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeySenderEmail)
|
|
|
|
if err != nil {
|
|
|
|
log.Errorf("Error while getting sender email from env variable: %v", err)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
smtpPort, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeySmtpPort)
|
|
|
|
if err != nil {
|
|
|
|
log.Errorf("Error while getting smtp port from env variable: %v", err)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
smtpHost, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeySmtpHost)
|
|
|
|
if err != nil {
|
|
|
|
log.Errorf("Error while getting smtp host from env variable: %v", err)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
smtpUsername, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeySmtpUsername)
|
|
|
|
if err != nil {
|
|
|
|
log.Errorf("Error while getting smtp username from env variable: %v", err)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
smtpPassword, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeySmtpPassword)
|
|
|
|
if err != nil {
|
|
|
|
log.Errorf("Error while getting smtp password from env variable: %v", err)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
isProd, err := memorystore.Provider.GetBoolStoreEnvVariable(constants.EnvKeyIsProd)
|
|
|
|
if err != nil {
|
|
|
|
log.Errorf("Error while getting env variable: %v", err)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
m.SetHeader("From", senderEmail)
|
2022-01-08 08:38:42 +00:00
|
|
|
m.SetHeader("To", to...)
|
2022-08-08 20:13:37 +00:00
|
|
|
m.SetHeader("Subject", tmp.Subject)
|
|
|
|
m.SetBody("text/html", tmp.Template)
|
2022-05-29 11:52:46 +00:00
|
|
|
port, _ := strconv.Atoi(smtpPort)
|
|
|
|
d := gomail.NewDialer(smtpHost, port, smtpUsername, smtpPassword)
|
|
|
|
if !isProd {
|
2022-01-08 08:38:42 +00:00
|
|
|
d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
|
|
|
|
}
|
|
|
|
if err := d.DialAndSend(m); err != nil {
|
2022-05-25 07:00:22 +00:00
|
|
|
log.Debug("SMTP Failed: ", err)
|
2021-07-12 18:22:16 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|