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_team_invite.go 2.1KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Copyright 2022 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package mailer
  4. import (
  5. "bytes"
  6. "context"
  7. "fmt"
  8. "net/url"
  9. org_model "code.gitea.io/gitea/models/organization"
  10. user_model "code.gitea.io/gitea/models/user"
  11. "code.gitea.io/gitea/modules/base"
  12. "code.gitea.io/gitea/modules/log"
  13. "code.gitea.io/gitea/modules/setting"
  14. "code.gitea.io/gitea/modules/translation"
  15. )
  16. const (
  17. tplTeamInviteMail base.TplName = "team_invite"
  18. )
  19. // MailTeamInvite sends team invites
  20. func MailTeamInvite(ctx context.Context, inviter *user_model.User, team *org_model.Team, invite *org_model.TeamInvite) error {
  21. if setting.MailService == nil {
  22. return nil
  23. }
  24. org, err := user_model.GetUserByID(ctx, team.OrgID)
  25. if err != nil {
  26. return err
  27. }
  28. locale := translation.NewLocale(inviter.Language)
  29. // check if a user with this email already exists
  30. user, err := user_model.GetUserByEmail(ctx, invite.Email)
  31. if err != nil && !user_model.IsErrUserNotExist(err) {
  32. return err
  33. } else if user != nil && user.ProhibitLogin {
  34. return fmt.Errorf("login is prohibited for the invited user")
  35. }
  36. inviteRedirect := url.QueryEscape(fmt.Sprintf("/org/invite/%s", invite.Token))
  37. inviteURL := fmt.Sprintf("%suser/sign_up?redirect_to=%s", setting.AppURL, inviteRedirect)
  38. if (err == nil && user != nil) || setting.Service.DisableRegistration || setting.Service.AllowOnlyExternalRegistration {
  39. // user account exists or registration disabled
  40. inviteURL = fmt.Sprintf("%suser/login?redirect_to=%s", setting.AppURL, inviteRedirect)
  41. }
  42. subject := locale.Tr("mail.team_invite.subject", inviter.DisplayName(), org.DisplayName())
  43. mailMeta := map[string]any{
  44. "locale": locale,
  45. "Inviter": inviter,
  46. "Organization": org,
  47. "Team": team,
  48. "Invite": invite,
  49. "Subject": subject,
  50. "InviteURL": inviteURL,
  51. }
  52. var mailBody bytes.Buffer
  53. if err := bodyTemplates.ExecuteTemplate(&mailBody, string(tplTeamInviteMail), mailMeta); err != nil {
  54. log.Error("ExecuteTemplate [%s]: %v", string(tplTeamInviteMail)+"/body", err)
  55. return err
  56. }
  57. msg := NewMessage(invite.Email, subject, mailBody.String())
  58. msg.Info = subject
  59. SendAsync(msg)
  60. return nil
  61. }