From afcb224a79a38f164a8965bff12a14e0dc177fae Mon Sep 17 00:00:00 2001 From: Martin Kraft Date: Mon, 4 Feb 2019 17:01:05 -0500 Subject: [PATCH] Adds configuration for separate reply-to email header. (#10144) * Adds configuration for separate reply-to email header. * Changes config setting name. * Using a separate variable and value in test. * Updates for config pointer changes in another PR. * Adds new key to test config. Adds default value. --- api4/system_test.go | 1 + app/diagnostics.go | 1 + build/release.mk | 1 + config/default.json | 1 + model/config.go | 5 +++++ services/mailservice/mail.go | 10 ++++++---- services/mailservice/mail_test.go | 3 ++- tests/test-config.json | 1 + 8 files changed, 18 insertions(+), 5 deletions(-) diff --git a/api4/system_test.go b/api4/system_test.go index e0e2bfaca4..252990e030 100644 --- a/api4/system_test.go +++ b/api4/system_test.go @@ -426,6 +426,7 @@ func TestEmailTest(t *testing.T) { SMTPPassword: model.NewString(""), FeedbackName: model.NewString(""), FeedbackEmail: model.NewString(""), + ReplyToAddress: model.NewString(""), SendEmailNotifications: model.NewBool(false), }, } diff --git a/app/diagnostics.go b/app/diagnostics.go index 76161ae899..0de1619dc9 100644 --- a/app/diagnostics.go +++ b/app/diagnostics.go @@ -389,6 +389,7 @@ func (a *App) trackConfig() { "enable_preview_mode_banner": *cfg.EmailSettings.EnablePreviewModeBanner, "isdefault_feedback_name": isDefault(cfg.EmailSettings.FeedbackName, ""), "isdefault_feedback_email": isDefault(cfg.EmailSettings.FeedbackEmail, ""), + "isdefault_reply_to_address": isDefault(cfg.EmailSettings.ReplyToAddress, ""), "isdefault_feedback_organization": isDefault(*cfg.EmailSettings.FeedbackOrganization, model.EMAIL_SETTINGS_DEFAULT_FEEDBACK_ORGANIZATION), "skip_server_certificate_verification": *cfg.EmailSettings.SkipServerCertificateVerification, "isdefault_login_button_color": isDefault(*cfg.EmailSettings.LoginButtonColor, ""), diff --git a/build/release.mk b/build/release.mk index f52e20b77e..7da9ab8580 100644 --- a/build/release.mk +++ b/build/release.mk @@ -44,6 +44,7 @@ package: @# Reset email sending to original configuration sed -i'' -e 's|"SendEmailNotifications": true,|"SendEmailNotifications": false,|g' $(DIST_PATH)/config/config.json sed -i'' -e 's|"FeedbackEmail": "test@example.com",|"FeedbackEmail": "",|g' $(DIST_PATH)/config/config.json + sed -i'' -e 's|"ReplyToAddress": "test@example.com",|"ReplyToAddress": "",|g' $(DIST_PATH)/config/config.json sed -i'' -e 's|"SMTPServer": "dockerhost",|"SMTPServer": "",|g' $(DIST_PATH)/config/config.json sed -i'' -e 's|"SMTPPort": "2500",|"SMTPPort": "",|g' $(DIST_PATH)/config/config.json diff --git a/config/default.json b/config/default.json index 6c1df5d085..167b1fce8d 100644 --- a/config/default.json +++ b/config/default.json @@ -181,6 +181,7 @@ "RequireEmailVerification": false, "FeedbackName": "", "FeedbackEmail": "test@example.com", + "ReplyToAddress": "test@example.com", "FeedbackOrganization": "", "EnableSMTPAuth": false, "SMTPUsername": "", diff --git a/model/config.go b/model/config.go index 1832f91ded..eb9d4200b6 100644 --- a/model/config.go +++ b/model/config.go @@ -1020,6 +1020,7 @@ type EmailSettings struct { RequireEmailVerification *bool FeedbackName *string FeedbackEmail *string + ReplyToAddress *string FeedbackOrganization *string EnableSMTPAuth *bool SMTPUsername *string @@ -1075,6 +1076,10 @@ func (s *EmailSettings) SetDefaults() { s.FeedbackEmail = NewString("test@example.com") } + if s.ReplyToAddress == nil { + s.ReplyToAddress = NewString("test@example.com") + } + if s.FeedbackOrganization == nil { s.FeedbackOrganization = NewString(EMAIL_SETTINGS_DEFAULT_FEEDBACK_ORGANIZATION) } diff --git a/services/mailservice/mail.go b/services/mailservice/mail.go index 68ae86faa5..fad4fe0255 100644 --- a/services/mailservice/mail.go +++ b/services/mailservice/mail.go @@ -199,12 +199,13 @@ func TestConnection(config *model.Config) { func SendMailUsingConfig(to, subject, htmlBody string, config *model.Config, enableComplianceFeatures bool) *model.AppError { fromMail := mail.Address{Name: *config.EmailSettings.FeedbackName, Address: *config.EmailSettings.FeedbackEmail} + replyTo := mail.Address{Name: *config.EmailSettings.FeedbackName, Address: *config.EmailSettings.ReplyToAddress} - return SendMailUsingConfigAdvanced(to, to, fromMail, subject, htmlBody, nil, nil, config, enableComplianceFeatures) + return SendMailUsingConfigAdvanced(to, to, fromMail, replyTo, subject, htmlBody, nil, nil, config, enableComplianceFeatures) } // allows for sending an email with attachments and differing MIME/SMTP recipients -func SendMailUsingConfigAdvanced(mimeTo, smtpTo string, from mail.Address, subject, htmlBody string, attachments []*model.FileInfo, mimeHeaders map[string]string, config *model.Config, enableComplianceFeatures bool) *model.AppError { +func SendMailUsingConfigAdvanced(mimeTo, smtpTo string, from, replyTo mail.Address, subject, htmlBody string, attachments []*model.FileInfo, mimeHeaders map[string]string, config *model.Config, enableComplianceFeatures bool) *model.AppError { if !*config.EmailSettings.SendEmailNotifications || len(*config.EmailSettings.SMTPServer) == 0 { return nil } @@ -227,10 +228,10 @@ func SendMailUsingConfigAdvanced(mimeTo, smtpTo string, from mail.Address, subje return err } - return SendMail(c, mimeTo, smtpTo, from, subject, htmlBody, attachments, mimeHeaders, fileBackend, time.Now()) + return SendMail(c, mimeTo, smtpTo, from, replyTo, subject, htmlBody, attachments, mimeHeaders, fileBackend, time.Now()) } -func SendMail(c *smtp.Client, mimeTo, smtpTo string, from mail.Address, subject, htmlBody string, attachments []*model.FileInfo, mimeHeaders map[string]string, fileBackend filesstore.FileBackend, date time.Time) *model.AppError { +func SendMail(c *smtp.Client, mimeTo, smtpTo string, from, replyTo mail.Address, subject, htmlBody string, attachments []*model.FileInfo, mimeHeaders map[string]string, fileBackend filesstore.FileBackend, date time.Time) *model.AppError { mlog.Debug(fmt.Sprintf("sending mail to %v with subject of '%v'", smtpTo, subject)) htmlMessage := "\r\n" + htmlBody + "" @@ -243,6 +244,7 @@ func SendMail(c *smtp.Client, mimeTo, smtpTo string, from mail.Address, subject, headers := map[string][]string{ "From": {from.String()}, + "Reply-To": {replyTo.String()}, "To": {mimeTo}, "Subject": {encodeRFC2047Word(subject)}, "Content-Transfer-Encoding": {"8bit"}, diff --git a/services/mailservice/mail_test.go b/services/mailservice/mail_test.go index f7dd1db927..6f56e1f20b 100644 --- a/services/mailservice/mail_test.go +++ b/services/mailservice/mail_test.go @@ -142,6 +142,7 @@ func TestSendMailUsingConfigAdvanced(t *testing.T) { var mimeTo = "test@example.com" var smtpTo = "test2@example.com" var from = mail.Address{Name: "Nobody", Address: "nobody@mattermost.com"} + var replyTo = mail.Address{Name: "ReplyTo", Address: "reply_to@mattermost.com"} var emailSubject = "Testing this email" var emailBody = "This is a test from autobot" @@ -177,7 +178,7 @@ func TestSendMailUsingConfigAdvanced(t *testing.T) { headers := make(map[string]string) headers["TestHeader"] = "TestValue" - if err := SendMailUsingConfigAdvanced(mimeTo, smtpTo, from, emailSubject, emailBody, attachments, headers, cfg, true); err != nil { + if err := SendMailUsingConfigAdvanced(mimeTo, smtpTo, from, replyTo, emailSubject, emailBody, attachments, headers, cfg, true); err != nil { t.Log(err) t.Fatal("Should connect to the STMP Server") } else { diff --git a/tests/test-config.json b/tests/test-config.json index 8574f5f131..446deb1560 100644 --- a/tests/test-config.json +++ b/tests/test-config.json @@ -163,6 +163,7 @@ "RequireEmailVerification": false, "FeedbackName": "", "FeedbackEmail": "test@example.com", + "ReplyToAddress": "test@example.com", "FeedbackOrganization": "", "EnableSMTPAuth": false, "SMTPUsername": "",