gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package mailer
  4. import (
  5. "bytes"
  6. "context"
  7. "fmt"
  8. "code.gitea.io/gitea/models/organization"
  9. repo_model "code.gitea.io/gitea/models/repo"
  10. user_model "code.gitea.io/gitea/models/user"
  11. "code.gitea.io/gitea/modules/log"
  12. "code.gitea.io/gitea/modules/setting"
  13. "code.gitea.io/gitea/modules/templates"
  14. "code.gitea.io/gitea/modules/translation"
  15. sender_service "code.gitea.io/gitea/services/mailer/sender"
  16. )
  17. const (
  18. mailNotifyCollaborator templates.TplName = "repo/collaborator"
  19. mailRepoTransferNotify templates.TplName = "repo/transfer"
  20. )
  21. // SendRepoTransferNotifyMail triggers a notification e-mail when a pending repository transfer was created
  22. func SendRepoTransferNotifyMail(ctx context.Context, doer, newOwner *user_model.User, repo *repo_model.Repository) error {
  23. if setting.MailService == nil {
  24. // No mail service configured
  25. return nil
  26. }
  27. if newOwner.IsOrganization() {
  28. users, err := organization.GetUsersWhoCanCreateOrgRepo(ctx, newOwner.ID)
  29. if err != nil {
  30. return err
  31. }
  32. langMap := make(map[string][]*user_model.User)
  33. for _, user := range users {
  34. if !user.IsActive {
  35. // don't send emails to inactive users
  36. continue
  37. }
  38. langMap[user.Language] = append(langMap[user.Language], user)
  39. }
  40. for lang, tos := range langMap {
  41. if err := sendRepoTransferNotifyMailPerLang(lang, newOwner, doer, tos, repo); err != nil {
  42. return err
  43. }
  44. }
  45. return nil
  46. }
  47. return sendRepoTransferNotifyMailPerLang(newOwner.Language, newOwner, doer, []*user_model.User{newOwner}, repo)
  48. }
  49. // sendRepoTransferNotifyMail triggers a notification e-mail when a pending repository transfer was created for each language
  50. func sendRepoTransferNotifyMailPerLang(lang string, newOwner, doer *user_model.User, emailTos []*user_model.User, repo *repo_model.Repository) error {
  51. var (
  52. locale = translation.NewLocale(lang)
  53. content bytes.Buffer
  54. )
  55. destination := locale.TrString("mail.repo.transfer.to_you")
  56. subject := locale.TrString("mail.repo.transfer.subject_to_you", doer.DisplayName(), repo.FullName())
  57. if newOwner.IsOrganization() {
  58. destination = newOwner.DisplayName()
  59. subject = locale.TrString("mail.repo.transfer.subject_to", doer.DisplayName(), repo.FullName(), destination)
  60. }
  61. data := map[string]any{
  62. "locale": locale,
  63. "Doer": doer,
  64. "User": repo.Owner,
  65. "Repo": repo.FullName(),
  66. "Link": repo.HTMLURL(),
  67. "Subject": subject,
  68. "Language": locale.Language(),
  69. "Destination": destination,
  70. }
  71. if err := LoadedTemplates().BodyTemplates.ExecuteTemplate(&content, string(mailRepoTransferNotify), data); err != nil {
  72. return err
  73. }
  74. for _, to := range emailTos {
  75. msg := sender_service.NewMessageFrom(to.EmailTo(), fromDisplayName(doer), setting.MailService.FromEmail, subject, content.String())
  76. msg.Info = fmt.Sprintf("UID: %d, repository pending transfer notification", newOwner.ID)
  77. SendAsync(msg)
  78. }
  79. return nil
  80. }
  81. // SendCollaboratorMail sends mail notification to new collaborator.
  82. func SendCollaboratorMail(u, doer *user_model.User, repo *repo_model.Repository) {
  83. if setting.MailService == nil || !u.IsActive {
  84. return
  85. }
  86. locale := translation.NewLocale(u.Language)
  87. repoName := repo.FullName()
  88. subject := locale.TrString("mail.repo.collaborator.added.subject", doer.DisplayName(), repoName)
  89. data := map[string]any{
  90. "locale": locale,
  91. "Subject": subject,
  92. "RepoName": repoName,
  93. "Link": repo.HTMLURL(),
  94. "Language": locale.Language(),
  95. }
  96. var content bytes.Buffer
  97. if err := LoadedTemplates().BodyTemplates.ExecuteTemplate(&content, string(mailNotifyCollaborator), data); err != nil {
  98. log.Error("Template: %v", err)
  99. return
  100. }
  101. msg := sender_service.NewMessage(u.EmailTo(), subject, content.String())
  102. msg.Info = fmt.Sprintf("UID: %d, add collaborator", u.ID)
  103. SendAsync(msg)
  104. }