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 }