aboutsummaryrefslogtreecommitdiff
path: root/pkg/mailer
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/mailer')
-rw-r--r--pkg/mailer/mail.go12
-rw-r--r--pkg/mailer/mailer.go21
2 files changed, 23 insertions, 10 deletions
diff --git a/pkg/mailer/mail.go b/pkg/mailer/mail.go
index a5c9c217..200e2e11 100644
--- a/pkg/mailer/mail.go
+++ b/pkg/mailer/mail.go
@@ -94,7 +94,7 @@ func SendUserMail(c *macaron.Context, u User, tpl, code, subject, info string) {
msg := NewMessage([]string{u.Email()}, subject, body)
msg.Info = fmt.Sprintf("UID: %d, %s", u.ID(), info)
- SendAsync(msg)
+ Send(msg)
}
func SendActivateAccountMail(c *macaron.Context, u User) {
@@ -122,7 +122,7 @@ func SendActivateEmailMail(c *macaron.Context, u User, email string) {
msg := NewMessage([]string{email}, c.Tr("mail.activate_email"), body)
msg.Info = fmt.Sprintf("UID: %d, activate email", u.ID())
- SendAsync(msg)
+ Send(msg)
}
// SendRegisterNotifyMail triggers a notify e-mail by admin created a account.
@@ -139,7 +139,7 @@ func SendRegisterNotifyMail(c *macaron.Context, u User) {
msg := NewMessage([]string{u.Email()}, c.Tr("mail.register_notify"), body)
msg.Info = fmt.Sprintf("UID: %d, registration notify", u.ID())
- SendAsync(msg)
+ Send(msg)
}
// SendCollaboratorMail sends mail notification to new collaborator.
@@ -160,7 +160,7 @@ func SendCollaboratorMail(u, doer User, repo Repository) {
msg := NewMessage([]string{u.Email()}, subject, body)
msg.Info = fmt.Sprintf("UID: %d, add collaborator", u.ID())
- SendAsync(msg)
+ Send(msg)
}
func composeTplData(subject, body, link string) map[string]interface{} {
@@ -192,7 +192,7 @@ func SendIssueCommentMail(issue Issue, repo Repository, doer User, tos []string)
return
}
- SendAsync(composeIssueMessage(issue, repo, doer, MAIL_ISSUE_COMMENT, tos, "issue comment"))
+ Send(composeIssueMessage(issue, repo, doer, MAIL_ISSUE_COMMENT, tos, "issue comment"))
}
// SendIssueMentionMail composes and sends issue mention emails to target receivers.
@@ -200,5 +200,5 @@ func SendIssueMentionMail(issue Issue, repo Repository, doer User, tos []string)
if len(tos) == 0 {
return
}
- SendAsync(composeIssueMessage(issue, repo, doer, MAIL_ISSUE_MENTION, tos, "issue mention"))
+ Send(composeIssueMessage(issue, repo, doer, MAIL_ISSUE_MENTION, tos, "issue mention"))
}
diff --git a/pkg/mailer/mailer.go b/pkg/mailer/mailer.go
index 4c0960d6..25761832 100644
--- a/pkg/mailer/mailer.go
+++ b/pkg/mailer/mailer.go
@@ -24,6 +24,7 @@ import (
type Message struct {
Info string // Message information for log purpose.
*gomail.Message
+ confirmChan chan struct{}
}
// NewMessageFrom creates new mail message object with custom From header.
@@ -48,9 +49,9 @@ func NewMessageFrom(to []string, from, subject, htmlBody string) *Message {
}
}
msg.SetBody(contentType, body)
-
return &Message{
- Message: msg,
+ Message: msg,
+ confirmChan: make(chan struct{}),
}
}
@@ -204,12 +205,14 @@ func processMailQueue() {
} else {
log.Trace("E-mails sent %s: %s", msg.GetHeader("To"), msg.Info)
}
+ msg.confirmChan <- struct{}{}
}
}
}
var mailQueue chan *Message
+// NewContext initializes settings for mailer.
func NewContext() {
// Need to check if mailQueue is nil because in during reinstall (user had installed
// before but swithed install lock off), this function will be called again
@@ -222,8 +225,18 @@ func NewContext() {
go processMailQueue()
}
-func SendAsync(msg *Message) {
+// Send puts new message object into mail queue.
+// It returns without confirmation (mail processed asynchronously) in normal cases,
+// but waits/blocks under hook mode to make sure mail has been sent.
+func Send(msg *Message) {
+ mailQueue <- msg
+
+ if setting.HookMode {
+ <-msg.confirmChan
+ return
+ }
+
go func() {
- mailQueue <- msg
+ <-msg.confirmChan
}()
}