diff --git a/src/Core/MailTemplates/Handlebars/Billing/BusinessUnitConversionInvite.html.hbs b/src/Core/MailTemplates/Handlebars/Billing/BusinessUnitConversionInvite.html.hbs
new file mode 100644
index 0000000000..59da019839
--- /dev/null
+++ b/src/Core/MailTemplates/Handlebars/Billing/BusinessUnitConversionInvite.html.hbs
@@ -0,0 +1,19 @@
+{{#>FullHtmlLayout}}
+
+{{/FullHtmlLayout}}
diff --git a/src/Core/MailTemplates/Handlebars/Billing/BusinessUnitConversionInvite.text.hbs b/src/Core/MailTemplates/Handlebars/Billing/BusinessUnitConversionInvite.text.hbs
new file mode 100644
index 0000000000..b2973f32c2
--- /dev/null
+++ b/src/Core/MailTemplates/Handlebars/Billing/BusinessUnitConversionInvite.text.hbs
@@ -0,0 +1,5 @@
+{{#>BasicTextLayout}}
+ You have been invited to set up a new Business Unit Portal within Bitwarden. To continue, click the following link:
+
+ {{{Url}}}
+{{/BasicTextLayout}}
diff --git a/src/Core/Models/Mail/Billing/BusinessUnitConversionInviteModel.cs b/src/Core/Models/Mail/Billing/BusinessUnitConversionInviteModel.cs
new file mode 100644
index 0000000000..a00df8180c
--- /dev/null
+++ b/src/Core/Models/Mail/Billing/BusinessUnitConversionInviteModel.cs
@@ -0,0 +1,11 @@
+namespace Bit.Core.Models.Mail.Billing;
+
+public class BusinessUnitConversionInviteModel : BaseMailModel
+{
+ public string OrganizationId { get; set; }
+ public string Email { get; set; }
+ public string Token { get; set; }
+
+ public string Url =>
+ $"{WebVaultUrl}/providers/setup-business-unit?organizationId={OrganizationId}&email={Email}&token={Token}";
+}
diff --git a/src/Core/Services/IMailService.cs b/src/Core/Services/IMailService.cs
index e61127c57a..83535c4b97 100644
--- a/src/Core/Services/IMailService.cs
+++ b/src/Core/Services/IMailService.cs
@@ -70,6 +70,7 @@ public interface IMailService
Task SendEnqueuedMailMessageAsync(IMailQueueMessage queueMessage);
Task SendAdminResetPasswordEmailAsync(string email, string userName, string orgName);
Task SendProviderSetupInviteEmailAsync(Provider provider, string token, string email);
+ Task SendBusinessUnitConversionInviteAsync(Organization organization, string token, string email);
Task SendProviderInviteEmailAsync(string providerName, ProviderUser providerUser, string token, string email);
Task SendProviderConfirmedEmailAsync(string providerName, string email);
Task SendProviderUserRemoved(string providerName, string email);
diff --git a/src/Core/Services/Implementations/HandlebarsMailService.cs b/src/Core/Services/Implementations/HandlebarsMailService.cs
index a551342324..1d6dc57177 100644
--- a/src/Core/Services/Implementations/HandlebarsMailService.cs
+++ b/src/Core/Services/Implementations/HandlebarsMailService.cs
@@ -11,6 +11,7 @@ using Bit.Core.Billing.Models.Mail;
using Bit.Core.Entities;
using Bit.Core.Models.Data.Organizations;
using Bit.Core.Models.Mail;
+using Bit.Core.Models.Mail.Billing;
using Bit.Core.Models.Mail.FamiliesForEnterprise;
using Bit.Core.Models.Mail.Provider;
using Bit.Core.SecretsManager.Models.Mail;
@@ -951,6 +952,22 @@ public class HandlebarsMailService : IMailService
await _mailDeliveryService.SendEmailAsync(message);
}
+ public async Task SendBusinessUnitConversionInviteAsync(Organization organization, string token, string email)
+ {
+ var message = CreateDefaultMessage("Set Up Business Unit", email);
+ var model = new BusinessUnitConversionInviteModel
+ {
+ WebVaultUrl = _globalSettings.BaseServiceUri.VaultWithHash,
+ SiteName = _globalSettings.SiteName,
+ OrganizationId = organization.Id.ToString(),
+ Email = WebUtility.UrlEncode(email),
+ Token = WebUtility.UrlEncode(token)
+ };
+ await AddMessageContentAsync(message, "Billing.BusinessUnitConversionInvite", model);
+ message.Category = "BusinessUnitConversionInvite";
+ await _mailDeliveryService.SendEmailAsync(message);
+ }
+
public async Task SendProviderInviteEmailAsync(string providerName, ProviderUser providerUser, string token, string email)
{
var message = CreateDefaultMessage($"Join {providerName}", email);
diff --git a/src/Core/Services/NoopImplementations/NoopMailService.cs b/src/Core/Services/NoopImplementations/NoopMailService.cs
index d829fbbacb..9730cc4988 100644
--- a/src/Core/Services/NoopImplementations/NoopMailService.cs
+++ b/src/Core/Services/NoopImplementations/NoopMailService.cs
@@ -212,6 +212,11 @@ public class NoopMailService : IMailService
return Task.FromResult(0);
}
+ public Task SendBusinessUnitConversionInviteAsync(Organization organization, string token, string email)
+ {
+ return Task.FromResult(0);
+ }
+
public Task SendProviderInviteEmailAsync(string providerName, ProviderUser providerUser, string token, string email)
{
return Task.FromResult(0);