2014-03-19 08:27:27 -04:00
|
|
|
// Copyright 2014 The Gogs Authors. All rights reserved.
|
2017-06-07 03:14:31 +02:00
|
|
|
// Copyright 2017 The Gitea Authors. All rights reserved.
|
2022-11-27 13:20:29 -05:00
|
|
|
// SPDX-License-Identifier: MIT
|
2014-03-19 08:27:27 -04:00
|
|
|
|
|
|
|
|
package mailer
|
|
|
|
|
|
|
|
|
|
import (
|
2022-08-28 10:43:25 +01:00
|
|
|
"context"
|
2015-09-17 01:54:12 -04:00
|
|
|
|
2020-01-16 17:55:36 +00:00
|
|
|
"code.gitea.io/gitea/modules/graceful"
|
2016-11-10 17:24:48 +01:00
|
|
|
"code.gitea.io/gitea/modules/log"
|
2020-01-16 17:55:36 +00:00
|
|
|
"code.gitea.io/gitea/modules/queue"
|
2016-11-10 17:24:48 +01:00
|
|
|
"code.gitea.io/gitea/modules/setting"
|
2022-08-08 20:04:28 +02:00
|
|
|
"code.gitea.io/gitea/modules/templates"
|
2024-11-29 17:15:41 -08:00
|
|
|
sender_service "code.gitea.io/gitea/services/mailer/sender"
|
2023-09-06 02:37:47 +08:00
|
|
|
notify_service "code.gitea.io/gitea/services/notify"
|
2014-03-19 08:27:27 -04:00
|
|
|
)
|
|
|
|
|
|
2024-11-29 17:15:41 -08:00
|
|
|
var mailQueue *queue.WorkerPoolQueue[*sender_service.Message]
|
2015-09-17 01:54:12 -04:00
|
|
|
|
2024-11-29 17:15:41 -08:00
|
|
|
// 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
|
2022-08-28 10:43:25 +01:00
|
|
|
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
|
2021-07-08 07:38:13 -04:00
|
|
|
// 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 {
|
2015-09-17 01:54:12 -04:00
|
|
|
return
|
2014-03-19 08:27:27 -04:00
|
|
|
}
|
2015-09-17 01:54:12 -04:00
|
|
|
|
2023-09-05 17:26:59 +08:00
|
|
|
if setting.Service.EnableNotifyMail {
|
2023-09-06 02:37:47 +08:00
|
|
|
notify_service.RegisterNotifier(NewNotifier())
|
2023-09-05 17:26:59 +08:00
|
|
|
}
|
|
|
|
|
|
2022-08-02 01:24:18 -04:00
|
|
|
switch setting.MailService.Protocol {
|
2019-02-03 02:06:52 +00:00
|
|
|
case "sendmail":
|
2024-11-29 17:15:41 -08:00
|
|
|
sender = &sender_service.SendmailSender{}
|
2019-02-03 02:06:52 +00:00
|
|
|
case "dummy":
|
2024-11-29 17:15:41 -08:00
|
|
|
sender = &sender_service.DummySender{}
|
2022-08-02 01:24:18 -04:00
|
|
|
default:
|
2024-11-29 17:15:41 -08:00
|
|
|
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
|
|
|
|
2024-11-29 17:15:41 -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()
|
2024-12-04 14:33:43 -08:00
|
|
|
log.Trace("New e-mail sending request %s: %s", gomailMsg.GetGenHeader("To"), msg.Info)
|
2024-11-29 17:15:41 -08:00
|
|
|
if err := sender_service.Send(sender, msg); err != nil {
|
2024-12-04 14:33:43 -08:00
|
|
|
log.Error("Failed to send emails %s: %s - %v", gomailMsg.GetGenHeader("To"), msg.Info, err)
|
2020-01-16 17:55:36 +00:00
|
|
|
} else {
|
2024-12-04 14:33:43 -08:00
|
|
|
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
|
2019-11-18 05:08:20 -03:00
|
|
|
|
2024-11-29 17:15:41 -08:00
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
2019-11-18 05:08:20 -03:00
|
|
|
go func() {
|
|
|
|
|
for _, msg := range msgs {
|
2020-01-16 17:55:36 +00:00
|
|
|
_ = mailQueue.Push(msg)
|
2019-11-18 05:08:20 -03:00
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
}
|