From 3f1b094cc92e17f1a74ba039130059300e64276c Mon Sep 17 00:00:00 2001 From: Denis Arh Date: Wed, 2 Sep 2020 13:09:41 +0200 Subject: [PATCH] Add SMTP_TSL_INSECURE and SMTP_TSL_SERVER_NAME for better SMTP TSL control --- corteza/corteza.go | 24 +++++++++++++++++++++++- pkg/app/options/smtp.go | 8 +++++++- pkg/mail/mail.go | 13 +++++++++++-- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/corteza/corteza.go b/corteza/corteza.go index 60defc25e..5ea2a98f3 100644 --- a/corteza/corteza.go +++ b/corteza/corteza.go @@ -2,7 +2,9 @@ package corteza import ( "context" + "crypto/tls" "github.com/cortezaproject/corteza-server/pkg/healthcheck" + gomail "gopkg.in/mail.v2" "time" "github.com/pkg/errors" @@ -51,7 +53,27 @@ func (app *App) Setup(log *zap.Logger, opts *app.Options) (err error) { defer sentry.Recover() auth.SetupDefault(opts.Auth.Secret, int(opts.Auth.Expiry/time.Minute)) - mail.SetupDialer(opts.SMTP.Host, opts.SMTP.Port, opts.SMTP.User, opts.SMTP.Pass, opts.SMTP.From) + mail.SetupDialer( + opts.SMTP.Host, + opts.SMTP.Port, + opts.SMTP.User, + opts.SMTP.Pass, + opts.SMTP.From, + + // Apply TLS configuration + func(d *gomail.Dialer) { + if d.TLSConfig == nil { + d.TLSConfig = &tls.Config{ServerName: d.Host} + } + + if opts.SMTP.TlsInsecure { + d.TLSConfig.InsecureSkipVerify = true + } + + if opts.SMTP.TlsServerName != "" { + d.TLSConfig.ServerName = opts.SMTP.TlsServerName + } + }) http.SetupDefaults( opts.HTTPClient.HttpClientTimeout, diff --git a/pkg/app/options/smtp.go b/pkg/app/options/smtp.go index 5db29bb53..6ab05921c 100644 --- a/pkg/app/options/smtp.go +++ b/pkg/app/options/smtp.go @@ -7,16 +7,22 @@ type ( User string `env:"SMTP_USER"` Pass string `env:"SMTP_PASS"` From string `env:"SMTP_FROM"` + + TlsInsecure bool `env:"SMTP_TSL_INSECURE"` + TlsServerName string `env:"SMTP_TSL_SERVER_NAME"` } ) func SMTP(pfix string) (o *SMTPOpt) { o = &SMTPOpt{ - Host: "localhost:25", + Host: "localhost", Port: 25, User: "", Pass: "", From: "", + + TlsInsecure: false, + TlsServerName: "", } fill(o, pfix) diff --git a/pkg/mail/mail.go b/pkg/mail/mail.go index 910589433..015f40701 100644 --- a/pkg/mail/mail.go +++ b/pkg/mail/mail.go @@ -13,6 +13,8 @@ type ( Dialer interface { DialAndSend(...*gomail.Message) error } + + applyCfg func(*gomail.Dialer) ) const ( @@ -33,7 +35,7 @@ func init() { // SetupDialer setups SMTP dialer // // Host variable can contain ":" that will override port value -func SetupDialer(host string, port int, user, pass, from string) { +func SetupDialer(host string, port int, user, pass, from string, ff ...applyCfg) { if host == "" { defaultDialerError = errors.New("No hostname provided for SMTP") return @@ -59,12 +61,19 @@ func SetupDialer(host string, port int, user, pass, from string) { } defaultFrom = from - defaultDialer = gomail.NewDialer( + dialer := gomail.NewDialer( host, port, user, pass, ) + + dialer.SSL = true + for _, fn := range ff { + fn(dialer) + } + + defaultDialer = dialer } func New() *gomail.Message {