Files

81 lines
2.4 KiB
Go
Raw Permalink Normal View History

2014-03-19 08:27:27 -04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
// Copyright 2017 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
2014-03-19 08:27:27 -04:00
package mailer
import (
"context"
2020-01-16 17:55:36 +00:00
"code.gitea.io/gitea/modules/graceful"
"code.gitea.io/gitea/modules/log"
2020-01-16 17:55:36 +00:00
"code.gitea.io/gitea/modules/queue"
"code.gitea.io/gitea/modules/setting"
2022-08-08 20:04:28 +02:00
"code.gitea.io/gitea/modules/templates"
sender_service "code.gitea.io/gitea/services/mailer/sender"
notify_service "code.gitea.io/gitea/services/notify"
2014-03-19 08:27:27 -04:00
)
var mailQueue *queue.WorkerPoolQueue[*sender_service.Message]
// sender sender for sending mail synchronously
var sender sender_service.Sender
2016-12-25 13:55:22 +00:00
2016-11-25 09:44:04 +08:00
// NewContext start mail queue service
func NewContext(ctx context.Context) {
2016-02-20 17:32:34 -05:00
// Need to check if mailQueue is nil because in during reinstall (user had installed
// before but switched install lock off), this function will be called again
2016-02-20 17:32:34 -05:00
// while mail queue is already processing tasks, and produces a race condition.
if setting.MailService == nil || mailQueue != nil {
return
2014-03-19 08:27:27 -04:00
}
if setting.Service.EnableNotifyMail {
notify_service.RegisterNotifier(NewNotifier())
}
2022-08-02 01:24:18 -04:00
switch setting.MailService.Protocol {
2019-02-03 02:06:52 +00:00
case "sendmail":
sender = &sender_service.SendmailSender{}
2019-02-03 02:06:52 +00:00
case "dummy":
sender = &sender_service.DummySender{}
2022-08-02 01:24:18 -04:00
default:
sender = &sender_service.SMTPSender{}
2016-12-25 13:55:22 +00:00
}
2026-01-24 13:11:49 +08:00
_ = templates.MailRenderer()
2023-05-26 15:31:55 +08:00
mailQueue = queue.CreateSimpleQueue(graceful.GetManager().ShutdownContext(), "mail", func(items ...*sender_service.Message) []*sender_service.Message {
2023-05-08 19:49:59 +08:00
for _, msg := range items {
2020-01-16 17:55:36 +00:00
gomailMsg := msg.ToMessage()
log.Trace("New e-mail sending request %s: %s", gomailMsg.GetGenHeader("To"), msg.Info)
if err := sender_service.Send(sender, msg); err != nil {
log.Error("Failed to send emails %s: %s - %v", gomailMsg.GetGenHeader("To"), msg.Info, err)
2020-01-16 17:55:36 +00:00
} else {
log.Trace("E-mails sent %s: %s", gomailMsg.GetGenHeader("To"), msg.Info)
2020-01-16 17:55:36 +00:00
}
}
2022-01-22 21:22:14 +00:00
return nil
2023-05-08 19:49:59 +08:00
})
2023-05-26 15:31:55 +08:00
if mailQueue == nil {
log.Fatal("Unable to create mail queue")
}
go graceful.GetManager().RunWithCancel(mailQueue)
2014-03-19 08:27:27 -04:00
}
2023-10-31 22:11:48 +08:00
// SendAsync send emails asynchronously (make it mockable)
var SendAsync = sendAsync
func sendAsync(msgs ...*sender_service.Message) {
2021-04-02 12:25:13 +02:00
if setting.MailService == nil {
2023-10-31 22:11:48 +08:00
log.Error("Mailer: SendAsync is being invoked but mail service hasn't been initialized")
2021-04-02 12:25:13 +02:00
return
}
go func() {
for _, msg := range msgs {
2020-01-16 17:55:36 +00:00
_ = mailQueue.Push(msg)
}
}()
}