diff options
Diffstat (limited to 'pkg/mailer')
-rw-r--r-- | pkg/mailer/mail.go | 12 | ||||
-rw-r--r-- | pkg/mailer/mailer.go | 21 |
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 }() } |