diff --git a/resources/views/emails/curated-register/admin_notify.blade.php b/resources/views/emails/curated-register/admin_notify.blade.php
index 15090cc43..5e85e6f91 100644
--- a/resources/views/emails/curated-register/admin_notify.blade.php
+++ b/resources/views/emails/curated-register/admin_notify.blade.php
@@ -19,7 +19,7 @@ Email: {{ $verify->email }}
*The user provided the following reason to join:*
-{!!Str::limit(nl2br($verify->reason_to_join), 300)!!}
+{!! nl2br(e(Str::limit($verify->reason_to_join, 300))) !!}
diff --git a/resources/views/emails/curated-register/admin_notify_user_response.blade.php b/resources/views/emails/curated-register/admin_notify_user_response.blade.php
index 504795f83..3fbad7668 100644
--- a/resources/views/emails/curated-register/admin_notify_user_response.blade.php
+++ b/resources/views/emails/curated-register/admin_notify_user_response.blade.php
@@ -6,7 +6,7 @@ Hello,
You have a new response from a curated onboarding application from **{{$activity->application->email}}**.
-{!! $activity->message !!}
+{!! nl2br(e($activity->message)) !!}
diff --git a/tests/Feature/CuratedRegisterEmailEscapeTest.php b/tests/Feature/CuratedRegisterEmailEscapeTest.php
new file mode 100644
index 000000000..ad2f467f2
--- /dev/null
+++ b/tests/Feature/CuratedRegisterEmailEscapeTest.php
@@ -0,0 +1,45 @@
+username = 'attacker';
+ $verify->email = 'attacker@example.com';
+ $verify->reason_to_join = "\nsecond line";
+ $verify->save();
+
+ $applicationHtml = (new CuratedRegisterNotifyAdmin($verify))->render();
+
+ expect($applicationHtml)->not->toContain('');
+ expect($applicationHtml)->toContain('<script>');
+ // Line breaks preserved via nl2br.
+ expect($applicationHtml)->toContain('
register_id = $verify->id;
+ $activity->message = '';
+ $activity->save();
+
+ $responseHtml = (new CuratedRegisterNotifyAdminUserResponse($activity))->render();
+
+ expect($responseHtml)->not->toContain('');
+ expect($responseHtml)->toContain('<script>');
+});