Skip to content

Commit 7cb70d9

Browse files
committed
Ensure that Message is json encodable
1 parent ff3bba2 commit 7cb70d9

File tree

3 files changed

+61
-34
lines changed

3 files changed

+61
-34
lines changed

services/mailer/mail.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func InitMailRender(subjectTpl *texttmpl.Template, bodyTpl *template.Template) {
5252

5353
// SendTestMail sends a test mail
5454
func SendTestMail(email string) error {
55-
return gomail.Send(Sender, NewMessage([]string{email}, "Gitea Test Email!", "Gitea Test Email!").Message)
55+
return gomail.Send(Sender, NewMessage([]string{email}, "Gitea Test Email!", "Gitea Test Email!").ToMessage())
5656
}
5757

5858
// SendUserMail sends a mail to the user

services/mailer/mail_test.go

+15-14
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ func TestComposeIssueCommentMessage(t *testing.T) {
6161
msgs := composeIssueCommentMessages(&mailCommentContext{Issue: issue, Doer: doer, ActionType: models.ActionCommentIssue,
6262
Content: "test body", Comment: comment}, tos, false, "issue comment")
6363
assert.Len(t, msgs, 2)
64-
65-
mailto := msgs[0].GetHeader("To")
66-
subject := msgs[0].GetHeader("Subject")
67-
inreplyTo := msgs[0].GetHeader("In-Reply-To")
68-
references := msgs[0].GetHeader("References")
64+
gomailMsg := msgs[0].ToMessage()
65+
mailto := gomailMsg.GetHeader("To")
66+
subject := gomailMsg.GetHeader("Subject")
67+
inreplyTo := gomailMsg.GetHeader("In-Reply-To")
68+
references := gomailMsg.GetHeader("References")
6969

7070
assert.Len(t, mailto, 1, "exactly one recipient is expected in the To field")
7171
assert.Equal(t, "Re: ", subject[0][:4], "Comment reply subject should contain Re:")
@@ -96,14 +96,15 @@ func TestComposeIssueMessage(t *testing.T) {
9696
Content: "test body"}, tos, false, "issue create")
9797
assert.Len(t, msgs, 2)
9898

99-
mailto := msgs[0].GetHeader("To")
100-
subject := msgs[0].GetHeader("Subject")
101-
messageID := msgs[0].GetHeader("Message-ID")
99+
gomailMsg := msgs[0].ToMessage()
100+
mailto := gomailMsg.GetHeader("To")
101+
subject := gomailMsg.GetHeader("Subject")
102+
messageID := gomailMsg.GetHeader("Message-ID")
102103

103104
assert.Len(t, mailto, 1, "exactly one recipient is expected in the To field")
104105
assert.Equal(t, "[user2/repo1] @user2 #1 - issue1", subject[0])
105-
assert.Nil(t, msgs[0].GetHeader("In-Reply-To"))
106-
assert.Nil(t, msgs[0].GetHeader("References"))
106+
assert.Nil(t, gomailMsg.GetHeader("In-Reply-To"))
107+
assert.Nil(t, gomailMsg.GetHeader("References"))
107108
assert.Equal(t, messageID[0], "<user2/repo1/issues/1@localhost>", "Message-ID header doesn't match")
108109
}
109110

@@ -134,9 +135,9 @@ func TestTemplateSelection(t *testing.T) {
134135
InitMailRender(stpl, btpl)
135136

136137
expect := func(t *testing.T, msg *Message, expSubject, expBody string) {
137-
subject := msg.GetHeader("Subject")
138+
subject := msg.ToMessage().GetHeader("Subject")
138139
msgbuf := new(bytes.Buffer)
139-
_, _ = msg.WriteTo(msgbuf)
140+
_, _ = msg.ToMessage().WriteTo(msgbuf)
140141
wholemsg := msgbuf.String()
141142
assert.Equal(t, []string{expSubject}, subject)
142143
assert.Contains(t, wholemsg, expBody)
@@ -188,9 +189,9 @@ func TestTemplateServices(t *testing.T) {
188189
msg := testComposeIssueCommentMessage(t, &mailCommentContext{Issue: issue, Doer: doer, ActionType: actionType,
189190
Content: "test body", Comment: comment}, tos, fromMention, "TestTemplateServices")
190191

191-
subject := msg.GetHeader("Subject")
192+
subject := msg.ToMessage().GetHeader("Subject")
192193
msgbuf := new(bytes.Buffer)
193-
_, _ = msg.WriteTo(msgbuf)
194+
_, _ = msg.ToMessage().WriteTo(msgbuf)
194195
wholemsg := msgbuf.String()
195196

196197
assert.Equal(t, []string{expSubject}, subject)

services/mailer/mailer.go

+45-19
Original file line numberDiff line numberDiff line change
@@ -29,38 +29,63 @@ import (
2929

3030
// Message mail body and log info
3131
type Message struct {
32-
Info string // Message information for log purpose.
33-
*gomail.Message
32+
Info string // Message information for log purpose.
33+
FromAddress string
34+
FromDisplayName string
35+
To []string
36+
Subject string
37+
Date time.Time
38+
Body string
39+
Headers map[string][]string
3440
}
3541

36-
// NewMessageFrom creates new mail message object with custom From header.
37-
func NewMessageFrom(to []string, fromDisplayName, fromAddress, subject, body string) *Message {
38-
log.Trace("NewMessageFrom (body):\n%s", body)
39-
42+
// ToMessage converts a Message to gomail.Message
43+
func (m *Message) ToMessage() *gomail.Message {
4044
msg := gomail.NewMessage()
41-
msg.SetAddressHeader("From", fromAddress, fromDisplayName)
42-
msg.SetHeader("To", to...)
45+
msg.SetAddressHeader("From", m.FromAddress, m.FromDisplayName)
46+
msg.SetHeader("To", m.To...)
47+
for header := range m.Headers {
48+
msg.SetHeader(header, m.Headers[header]...)
49+
}
50+
4351
if len(setting.MailService.SubjectPrefix) > 0 {
44-
msg.SetHeader("Subject", setting.MailService.SubjectPrefix+" "+subject)
52+
msg.SetHeader("Subject", setting.MailService.SubjectPrefix+" "+m.Subject)
4553
} else {
46-
msg.SetHeader("Subject", subject)
54+
msg.SetHeader("Subject", m.Subject)
4755
}
48-
msg.SetDateHeader("Date", time.Now())
56+
msg.SetDateHeader("Date", m.Date)
4957
msg.SetHeader("X-Auto-Response-Suppress", "All")
5058

51-
plainBody, err := html2text.FromString(body)
59+
plainBody, err := html2text.FromString(m.Body)
5260
if err != nil || setting.MailService.SendAsPlainText {
53-
if strings.Contains(base.TruncateString(body, 100), "<html>") {
61+
if strings.Contains(base.TruncateString(m.Body, 100), "<html>") {
5462
log.Warn("Mail contains HTML but configured to send as plain text.")
5563
}
5664
msg.SetBody("text/plain", plainBody)
5765
} else {
5866
msg.SetBody("text/plain", plainBody)
59-
msg.AddAlternative("text/html", body)
67+
msg.AddAlternative("text/html", m.Body)
6068
}
69+
return msg
70+
}
71+
72+
// SetHeader adds additional headers to a message
73+
func (m *Message) SetHeader(field string, value ...string) {
74+
m.Headers[field] = value
75+
}
76+
77+
// NewMessageFrom creates new mail message object with custom From header.
78+
func NewMessageFrom(to []string, fromDisplayName, fromAddress, subject, body string) *Message {
79+
log.Trace("NewMessageFrom (body):\n%s", body)
6180

6281
return &Message{
63-
Message: msg,
82+
FromAddress: fromAddress,
83+
FromDisplayName: fromDisplayName,
84+
To: to,
85+
Subject: subject,
86+
Date: time.Now(),
87+
Body: body,
88+
Headers: map[string][]string{},
6489
}
6590
}
6691

@@ -285,11 +310,12 @@ func NewContext() {
285310
mailQueue = setting.CreateQueue("mail", func(data ...queue.Data) {
286311
for _, datum := range data {
287312
msg := datum.(*Message)
288-
log.Trace("New e-mail sending request %s: %s", msg.GetHeader("To"), msg.Info)
289-
if err := gomail.Send(Sender, msg.Message); err != nil {
290-
log.Error("Failed to send emails %s: %s - %v", msg.GetHeader("To"), msg.Info, err)
313+
gomailMsg := msg.ToMessage()
314+
log.Trace("New e-mail sending request %s: %s", gomailMsg.GetHeader("To"), msg.Info)
315+
if err := gomail.Send(Sender, gomailMsg); err != nil {
316+
log.Error("Failed to send emails %s: %s - %v", gomailMsg.GetHeader("To"), msg.Info, err)
291317
} else {
292-
log.Trace("E-mails sent %s: %s", msg.GetHeader("To"), msg.Info)
318+
log.Trace("E-mails sent %s: %s", gomailMsg.GetHeader("To"), msg.Info)
293319
}
294320
}
295321
}, &Message{})

0 commit comments

Comments
 (0)