You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

mail.go 2.1KB

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