code.gitea.io/gitea@v1.21.7/routers/private/mail.go (about)

     1  // Copyright 2020 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package private
     5  
     6  import (
     7  	stdCtx "context"
     8  	"fmt"
     9  	"net/http"
    10  	"strconv"
    11  
    12  	"code.gitea.io/gitea/models/db"
    13  	user_model "code.gitea.io/gitea/models/user"
    14  	"code.gitea.io/gitea/modules/context"
    15  	"code.gitea.io/gitea/modules/json"
    16  	"code.gitea.io/gitea/modules/log"
    17  	"code.gitea.io/gitea/modules/private"
    18  	"code.gitea.io/gitea/modules/setting"
    19  	"code.gitea.io/gitea/services/mailer"
    20  )
    21  
    22  // SendEmail pushes messages to mail queue
    23  //
    24  // It doesn't wait before each message will be processed
    25  func SendEmail(ctx *context.PrivateContext) {
    26  	if setting.MailService == nil {
    27  		ctx.JSON(http.StatusInternalServerError, private.Response{
    28  			Err: "Mail service is not enabled.",
    29  		})
    30  		return
    31  	}
    32  
    33  	var mail private.Email
    34  	rd := ctx.Req.Body
    35  	defer rd.Close()
    36  
    37  	if err := json.NewDecoder(rd).Decode(&mail); err != nil {
    38  		log.Error("%v", err)
    39  		ctx.JSON(http.StatusInternalServerError, private.Response{
    40  			Err: err.Error(),
    41  		})
    42  		return
    43  	}
    44  
    45  	var emails []string
    46  	if len(mail.To) > 0 {
    47  		for _, uname := range mail.To {
    48  			user, err := user_model.GetUserByName(ctx, uname)
    49  			if err != nil {
    50  				err := fmt.Sprintf("Failed to get user information: %v", err)
    51  				log.Error(err)
    52  				ctx.JSON(http.StatusInternalServerError, private.Response{
    53  					Err: err,
    54  				})
    55  				return
    56  			}
    57  
    58  			if user != nil && len(user.Email) > 0 {
    59  				emails = append(emails, user.Email)
    60  			}
    61  		}
    62  	} else {
    63  		err := db.Iterate(ctx, nil, func(ctx stdCtx.Context, user *user_model.User) error {
    64  			if len(user.Email) > 0 && user.IsActive {
    65  				emails = append(emails, user.Email)
    66  			}
    67  			return nil
    68  		})
    69  		if err != nil {
    70  			err := fmt.Sprintf("Failed to find users: %v", err)
    71  			log.Error(err)
    72  			ctx.JSON(http.StatusInternalServerError, private.Response{
    73  				Err: err,
    74  			})
    75  			return
    76  		}
    77  	}
    78  
    79  	sendEmail(ctx, mail.Subject, mail.Message, emails)
    80  }
    81  
    82  func sendEmail(ctx *context.PrivateContext, subject, message string, to []string) {
    83  	for _, email := range to {
    84  		msg := mailer.NewMessage(email, subject, message)
    85  		mailer.SendAsync(msg)
    86  	}
    87  
    88  	wasSent := strconv.Itoa(len(to))
    89  
    90  	ctx.PlainText(http.StatusOK, wasSent)
    91  }