workaround for go smtp bug (#7620)

This commit is contained in:
Chris
2017-10-12 15:23:33 -07:00
committed by GitHub
parent aa2b82727f
commit 8966452d11

View File

@@ -7,14 +7,13 @@ import (
"crypto/tls" "crypto/tls"
"mime" "mime"
"net" "net"
"net/http"
"net/mail" "net/mail"
"net/smtp" "net/smtp"
"time" "time"
"gopkg.in/gomail.v2" "gopkg.in/gomail.v2"
"net/http"
l4g "github.com/alecthomas/log4go" l4g "github.com/alecthomas/log4go"
"github.com/mattermost/html2text" "github.com/mattermost/html2text"
"github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/model"
@@ -48,6 +47,20 @@ func connectToSMTPServer(config *model.Config) (net.Conn, *model.AppError) {
return conn, nil 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) { func newSMTPClient(conn net.Conn, config *model.Config) (*smtp.Client, *model.AppError) {
c, err := smtp.NewClient(conn, config.EmailSettings.SMTPServer+":"+config.EmailSettings.SMTPPort) c, err := smtp.NewClient(conn, config.EmailSettings.SMTPServer+":"+config.EmailSettings.SMTPPort)
if err != nil { if err != nil {
@@ -73,7 +86,12 @@ func newSMTPClient(conn net.Conn, config *model.Config) (*smtp.Client, *model.Ap
} }
if *config.EmailSettings.EnableSMTPAuth { 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 { if err = c.Auth(auth); err != nil {
return nil, model.NewAppError("SendMail", "utils.mail.new_client.auth.app_error", nil, err.Error(), http.StatusInternalServerError) return nil, model.NewAppError("SendMail", "utils.mail.new_client.auth.app_error", nil, err.Error(), http.StatusInternalServerError)