mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 09:31:53 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			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.gitea.io/gitea/modules/graceful"
 | |
| 	"code.gitea.io/gitea/modules/log"
 | |
| 	"code.gitea.io/gitea/modules/queue"
 | |
| 	"code.gitea.io/gitea/modules/setting"
 | |
| 	"code.gitea.io/gitea/modules/templates"
 | |
| 	sender_service "code.gitea.io/gitea/services/mailer/sender"
 | |
| 	notify_service "code.gitea.io/gitea/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)
 | |
| 		}
 | |
| 	}()
 | |
| }
 |