From 8966452d1183e94fecc373b9d08c65a0573cbbc6 Mon Sep 17 00:00:00 2001 From: Chris Date: Thu, 12 Oct 2017 15:23:33 -0700 Subject: workaround for go smtp bug (#7620) --- utils/mail.go | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'utils') diff --git a/utils/mail.go b/utils/mail.go index 7be1303d1..9bda4ee39 100644 --- a/utils/mail.go +++ b/utils/mail.go @@ -7,14 +7,13 @@ import ( "crypto/tls" "mime" "net" + "net/http" "net/mail" "net/smtp" "time" "gopkg.in/gomail.v2" - "net/http" - l4g "github.com/alecthomas/log4go" "github.com/mattermost/html2text" "github.com/mattermost/mattermost-server/model" @@ -48,6 +47,20 @@ func connectToSMTPServer(config *model.Config) (net.Conn, *model.AppError) { return conn, nil } +// TODO: Remove once this bug is fixed: https://github.com/golang/go/issues/22166 +type plainAuthOverTLSConn struct { + smtp.Auth +} + +func PlainAuthOverTLSConn(identity, username, password, host string) smtp.Auth { + return &plainAuthOverTLSConn{smtp.PlainAuth(identity, username, password, host)} +} + +func (a *plainAuthOverTLSConn) Start(server *smtp.ServerInfo) (string, []byte, error) { + server.TLS = true + return a.Auth.Start(server) +} + func newSMTPClient(conn net.Conn, config *model.Config) (*smtp.Client, *model.AppError) { c, err := smtp.NewClient(conn, config.EmailSettings.SMTPServer+":"+config.EmailSettings.SMTPPort) if err != nil { @@ -73,7 +86,12 @@ func newSMTPClient(conn net.Conn, config *model.Config) (*smtp.Client, *model.Ap } if *config.EmailSettings.EnableSMTPAuth { - auth := smtp.PlainAuth("", config.EmailSettings.SMTPUsername, config.EmailSettings.SMTPPassword, config.EmailSettings.SMTPServer+":"+config.EmailSettings.SMTPPort) + var auth smtp.Auth + if _, ok := conn.(*tls.Conn); ok { + auth = PlainAuthOverTLSConn("", config.EmailSettings.SMTPUsername, config.EmailSettings.SMTPPassword, config.EmailSettings.SMTPServer+":"+config.EmailSettings.SMTPPort) + } else { + auth = smtp.PlainAuth("", config.EmailSettings.SMTPUsername, config.EmailSettings.SMTPPassword, config.EmailSettings.SMTPServer+":"+config.EmailSettings.SMTPPort) + } if err = c.Auth(auth); err != nil { return nil, model.NewAppError("SendMail", "utils.mail.new_client.auth.app_error", nil, err.Error(), http.StatusInternalServerError) -- cgit v1.2.3-1-g7c22