diff --git a/backend/app/notify/email.go b/backend/app/notify/email.go index 1ea0a26a..eca91dd7 100644 --- a/backend/app/notify/email.go +++ b/backend/app/notify/email.go @@ -6,6 +6,7 @@ import ( "crypto/tls" "fmt" "io" + "mime" "mime/quotedprintable" "net" "net/smtp" @@ -303,7 +304,7 @@ func (e *Email) buildMessage(subject, body, to, contentType, unsubscribeLink str } message = addHeader(message, "From", e.From) message = addHeader(message, "To", to) - message = addHeader(message, "Subject", subject) + message = addHeader(message, "Subject", mime.BEncoding.Encode("utf-8", subject)) message = addHeader(message, "Content-Transfer-Encoding", "quoted-printable") if contentType != "" { diff --git a/backend/app/notify/email_test.go b/backend/app/notify/email_test.go index 1d7090bb..e7b98377 100644 --- a/backend/app/notify/email_test.go +++ b/backend/app/notify/email_test.go @@ -249,6 +249,38 @@ Content-Type: text/html; charset="UTF-8" Date: `) } +func TestEmail_SendWithUnicodeInSubject(t *testing.T) { + email, err := NewEmail(EmailParams{ + From: "from@example.org", + VerificationTemplatePath: "testdata/verification.html.tmpl", + MsgTemplatePath: "testdata/msg.html.tmpl", + }, SMTPParams{}) + assert.NoError(t, err) + assert.NotNil(t, email) + fakeSMTP := fakeTestSMTP{} + email.smtp = &fakeSMTP + email.TokenGenFn = TokenGenFn + email.UnsubscribeURL = "https://remark42.com/api/v1/email/unsubscribe" + req := Request{ + Comment: store.Comment{ID: "999", User: store.User{ID: "1", Name: "test_user"}, ParentID: "1", PostTitle: "Привет"}, + parent: store.Comment{ID: "1", User: store.User{ID: "999", Name: "parent_user"}}, + Emails: []string{"test@example.org"}, + } + // test buildMessageFromRequest separately for message text + res, err := email.buildMessageFromRequest(req, req.Emails[0], false) + assert.NoError(t, err) + // `=?utf-8?b?TmV3IHJlcGx5IHRvIHlvdXIgY29tbWVudCBmb3IgItCf0YDQuNCy0LXRgiI=?=` -> `New reply to your comment for "Привет"` in base64 + required prefix and suffix + assert.Contains(t, res, `From: from@example.org +To: test@example.org +Subject: =?utf-8?b?TmV3IHJlcGx5IHRvIHlvdXIgY29tbWVudCBmb3IgItCf0YDQuNCy0LXRgiI=?= +Content-Transfer-Encoding: quoted-printable +MIME-version: 1.0 +Content-Type: text/html; charset="UTF-8" +List-Unsubscribe-Post: List-Unsubscribe=One-Click +List-Unsubscribe: +Date: `) +} + func TestEmail_SendVerification(t *testing.T) { email, err := NewEmail(EmailParams{ From: "from@example.org",