From 30099bb85a437d50bb27f019199c331b511c4ea5 Mon Sep 17 00:00:00 2001 From: Jared McCannon Date: Tue, 14 Jul 2026 16:20:07 -0500 Subject: [PATCH 1/3] feat: [PM-36011] add member email change notification email --- .../MemberEmailChangedNotificationView.cs | 13 +++++ ...emberEmailChangedNotificationView.html.hbs | 51 +++++++++++++++++++ ...emberEmailChangedNotificationView.text.hbs | 7 +++ .../member-email-changed-notification.mjml | 43 ++++++++++++++++ ...MemberEmailChangedNotificationViewTests.cs | 25 +++++++++ 5 files changed, 139 insertions(+) create mode 100644 src/Core/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationView.cs create mode 100644 src/Core/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationView.html.hbs create mode 100644 src/Core/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationView.text.hbs create mode 100644 src/Core/MailTemplates/Mjml/emails/AdminConsole/MemberEmailChanged/member-email-changed-notification.mjml create mode 100644 test/Core.Test/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationViewTests.cs diff --git a/src/Core/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationView.cs b/src/Core/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationView.cs new file mode 100644 index 000000000000..71043d4a3773 --- /dev/null +++ b/src/Core/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationView.cs @@ -0,0 +1,13 @@ +using Bit.Core.Platform.Mail.Mailer; + +namespace Bit.Core.AdminConsole.Models.Mail.Mailer.MemberEmailChanged; + +public class MemberEmailChangedNotificationView : BaseMailView +{ + public required string NewEmail { get; set; } +} + +public class MemberEmailChangedNotificationMail : BaseMail +{ + public override string Subject { get; set; } = "Your Bitwarden account email was updated"; +} diff --git a/src/Core/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationView.html.hbs b/src/Core/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationView.html.hbs new file mode 100644 index 000000000000..bba91b844a64 --- /dev/null +++ b/src/Core/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationView.html.hbs @@ -0,0 +1,51 @@ +

Your Bitwarden account email was updated by an admin

Use the new email to log in to your account.
Your new email
{{NewEmail}}
If this change doesn't seem right, contact your admin.

Learn more about Bitwarden

Find user guides, product documentation, and videos on the Bitwarden Help Center.

© {{ CurrentYear }} Bitwarden Inc. 1 N. Calle Cesar Chavez, Suite 102, Santa Barbara, CA, USA

Always confirm you are on a trusted Bitwarden domain before logging in:
bitwarden.com | Learn why we include this

\ No newline at end of file diff --git a/src/Core/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationView.text.hbs b/src/Core/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationView.text.hbs new file mode 100644 index 000000000000..acf2c2c15f9e --- /dev/null +++ b/src/Core/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationView.text.hbs @@ -0,0 +1,7 @@ +Your Bitwarden account email was updated by an admin. + +Use the new email to log in to your account. + +Your new email: {{NewEmail}} + +If this change doesn't seem right, contact your admin. diff --git a/src/Core/MailTemplates/Mjml/emails/AdminConsole/MemberEmailChanged/member-email-changed-notification.mjml b/src/Core/MailTemplates/Mjml/emails/AdminConsole/MemberEmailChanged/member-email-changed-notification.mjml new file mode 100644 index 000000000000..0815ce7cf0ed --- /dev/null +++ b/src/Core/MailTemplates/Mjml/emails/AdminConsole/MemberEmailChanged/member-email-changed-notification.mjml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + Use the new email to log in to your account. + + + Your new email
+ {{NewEmail}} +
+ + If this change doesn't seem right, contact your admin. + +
+
+
+ + + + + + + + +
+
diff --git a/test/Core.Test/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationViewTests.cs b/test/Core.Test/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationViewTests.cs new file mode 100644 index 000000000000..44d16048298c --- /dev/null +++ b/test/Core.Test/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationViewTests.cs @@ -0,0 +1,25 @@ +using Bit.Core.AdminConsole.Models.Mail.Mailer.MemberEmailChanged; +using Bit.Core.Platform.Mail.Mailer; +using Bit.Core.Settings; +using Microsoft.Extensions.Logging; +using NSubstitute; +using Xunit; + +namespace Bit.Core.Test.AdminConsole.Models.Mail.Mailer.MemberEmailChanged; + +public class MemberEmailChangedNotificationViewTests +{ + [Fact] + public async Task RenderAsync_PopulatesNewEmailInBothTemplates() + { + var renderer = new HandlebarMailRenderer( + Substitute.For>(), + new GlobalSettings()); + + var (html, text) = await renderer.RenderAsync( + new MemberEmailChangedNotificationView { NewEmail = "new@acme.com" }); + + Assert.Contains("new@acme.com", html); + Assert.Contains("new@acme.com", text); + } +} From cd8cab5b605db3b7404f5ebbc6ffa31fbc713bf8 Mon Sep 17 00:00:00 2001 From: Jared McCannon Date: Wed, 15 Jul 2026 15:09:22 -0500 Subject: [PATCH 2/3] updated with asset --- .../MemberEmailChanged/member-email-changed-notification.mjml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/MailTemplates/Mjml/emails/AdminConsole/MemberEmailChanged/member-email-changed-notification.mjml b/src/Core/MailTemplates/Mjml/emails/AdminConsole/MemberEmailChanged/member-email-changed-notification.mjml index 0815ce7cf0ed..7c763f35702f 100644 --- a/src/Core/MailTemplates/Mjml/emails/AdminConsole/MemberEmailChanged/member-email-changed-notification.mjml +++ b/src/Core/MailTemplates/Mjml/emails/AdminConsole/MemberEmailChanged/member-email-changed-notification.mjml @@ -10,7 +10,7 @@ From b118fb3af295bb58717073395fb33f0ec1d86a90 Mon Sep 17 00:00:00 2001 From: Jared McCannon Date: Wed, 15 Jul 2026 15:14:34 -0500 Subject: [PATCH 3/3] chore: [PM-36011] rebuild html template for updated asset --- .../MemberEmailChangedNotificationView.html.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationView.html.hbs b/src/Core/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationView.html.hbs index bba91b844a64..494efb374d1f 100644 --- a/src/Core/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationView.html.hbs +++ b/src/Core/AdminConsole/Models/Mail/Mailer/MemberEmailChanged/MemberEmailChangedNotificationView.html.hbs @@ -48,4 +48,4 @@ .hide-mobile { display: none !important; } - }

Your Bitwarden account email was updated by an admin

Use the new email to log in to your account.
Your new email
{{NewEmail}}
If this change doesn't seem right, contact your admin.

Learn more about Bitwarden

Find user guides, product documentation, and videos on the Bitwarden Help Center.

© {{ CurrentYear }} Bitwarden Inc. 1 N. Calle Cesar Chavez, Suite 102, Santa Barbara, CA, USA

Always confirm you are on a trusted Bitwarden domain before logging in:
bitwarden.com | Learn why we include this

\ No newline at end of file + }

Your Bitwarden account email was updated by an admin

Use the new email to log in to your account.
Your new email
{{NewEmail}}
If this change doesn't seem right, contact your admin.

Learn more about Bitwarden

Find user guides, product documentation, and videos on the Bitwarden Help Center.

© {{ CurrentYear }} Bitwarden Inc. 1 N. Calle Cesar Chavez, Suite 102, Santa Barbara, CA, USA

Always confirm you are on a trusted Bitwarden domain before logging in:
bitwarden.com | Learn why we include this

\ No newline at end of file