Some checks failed
Build and Release / Create Release (push) Successful in 0s
Trigger Vault Plugin Rebuild / Trigger Vault Rebuild (push) Successful in 0s
Build and Release / Integration Tests (PostgreSQL) (push) Successful in 2m48s
Build and Release / Lint (push) Failing after 5m2s
Build and Release / Build Binaries (amd64, windows, windows-latest) (push) Has been skipped
Build and Release / Build Binaries (amd64, darwin, linux-latest) (push) Has been skipped
Build and Release / Build Binaries (amd64, linux, linux-latest) (push) Has been skipped
Build and Release / Build Binaries (arm64, darwin, linux-latest) (push) Has been skipped
Build and Release / Build Binaries (arm64, linux, linux-latest) (push) Has been skipped
Build and Release / Unit Tests (push) Successful in 5m37s
Go's semantic import versioning requires v2+ modules to include the major version in the module path. This enables using proper version tags (v3.x.x) instead of pseudo-versions. Updated module path: code.gitcaddy.com/server/v3
81 lines
2.4 KiB
Go
81 lines
2.4 KiB
Go
// Copyright 2014 The Gogs Authors. All rights reserved.
|
|
// Copyright 2017 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package mailer
|
|
|
|
import (
|
|
"context"
|
|
|
|
"code.gitcaddy.com/server/v3/modules/graceful"
|
|
"code.gitcaddy.com/server/v3/modules/log"
|
|
"code.gitcaddy.com/server/v3/modules/queue"
|
|
"code.gitcaddy.com/server/v3/modules/setting"
|
|
"code.gitcaddy.com/server/v3/modules/templates"
|
|
sender_service "code.gitcaddy.com/server/v3/services/mailer/sender"
|
|
notify_service "code.gitcaddy.com/server/v3/services/notify"
|
|
)
|
|
|
|
var mailQueue *queue.WorkerPoolQueue[*sender_service.Message]
|
|
|
|
// sender sender for sending mail synchronously
|
|
var sender sender_service.Sender
|
|
|
|
// NewContext start mail queue service
|
|
func NewContext(ctx context.Context) {
|
|
// 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
|
|
// while mail queue is already processing tasks, and produces a race condition.
|
|
if setting.MailService == nil || mailQueue != nil {
|
|
return
|
|
}
|
|
|
|
if setting.Service.EnableNotifyMail {
|
|
notify_service.RegisterNotifier(NewNotifier())
|
|
}
|
|
|
|
switch setting.MailService.Protocol {
|
|
case "sendmail":
|
|
sender = &sender_service.SendmailSender{}
|
|
case "dummy":
|
|
sender = &sender_service.DummySender{}
|
|
default:
|
|
sender = &sender_service.SMTPSender{}
|
|
}
|
|
|
|
templates.LoadMailTemplates(ctx, &loadedTemplates)
|
|
|
|
mailQueue = queue.CreateSimpleQueue(graceful.GetManager().ShutdownContext(), "mail", func(items ...*sender_service.Message) []*sender_service.Message {
|
|
for _, msg := range items {
|
|
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)
|
|
} else {
|
|
log.Trace("E-mails sent %s: %s", gomailMsg.GetGenHeader("To"), msg.Info)
|
|
}
|
|
}
|
|
return nil
|
|
})
|
|
if mailQueue == nil {
|
|
log.Fatal("Unable to create mail queue")
|
|
}
|
|
go graceful.GetManager().RunWithCancel(mailQueue)
|
|
}
|
|
|
|
// SendAsync send emails asynchronously (make it mockable)
|
|
var SendAsync = sendAsync
|
|
|
|
func sendAsync(msgs ...*sender_service.Message) {
|
|
if setting.MailService == nil {
|
|
log.Error("Mailer: SendAsync is being invoked but mail service hasn't been initialized")
|
|
return
|
|
}
|
|
|
|
go func() {
|
|
for _, msg := range msgs {
|
|
_ = mailQueue.Push(msg)
|
|
}
|
|
}()
|
|
}
|