gitea源码

mail.go 2.2KB

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