diff --git a/core/lib/Drupal/Core/Mail/Plugin/Mail/TestHtmlMailCollector.php b/core/lib/Drupal/Core/Mail/Plugin/Mail/TestHtmlMailCollector.php
new file mode 100644
index 0000000..b83c24d
--- /dev/null
+++ b/core/lib/Drupal/Core/Mail/Plugin/Mail/TestHtmlMailCollector.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Drupal\Core\Mail\Plugin\Mail;
+
+use Drupal\Core\Mail\MailFormatHelper;
+use Drupal\Core\Mail\Plugin\Mail\TestMailCollector;
+
+
+/**
+ * A mail sending implementation that captures sent messages to a variable.
+ *
+ * This class is for running tests or for development and does not convert HTML
+ * to plaintext.
+ *
+ * @Mail(
+ *   id = "test_html_mail_collector",
+ *   label = @Translation("HTML test mailer"),
+ *   description = @Translation("Saves the message as HTML to a variable.")
+ * )
+ */
+class TestHtmlMailCollector extends TestMailCollector {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function format(array $message) {
+    // Join the body array into one string.
+    $message['body'] = implode(PHP_EOL, $message['body']);
+    // Wrap the mail body for sending.
+    $message['body'] = MailFormatHelper::wrapMail($message['body']);
+    return $message;
+  }
+}
diff --git a/core/modules/contact/tests/src/Functional/ContactPersonalTest.php b/core/modules/contact/tests/src/Functional/ContactPersonalTest.php
index 7e6ecad..8d93de8 100644
--- a/core/modules/contact/tests/src/Functional/ContactPersonalTest.php
+++ b/core/modules/contact/tests/src/Functional/ContactPersonalTest.php
@@ -88,7 +88,9 @@ public function testSendPersonalContactMessage() {
     $this->assertEqual($mail['subject'], $subject, 'Subject is in sent message.');
     $this->assertTrue(strpos($mail['body'], 'Hello ' . $variables['@recipient-name']) !== FALSE, 'Recipient name is in sent message.');
     $this->assertTrue(strpos($mail['body'], $this->webUser->getDisplayName()) !== FALSE, 'Sender name is in sent message.');
-    $this->assertTrue(strpos($mail['body'], $message['message[0][value]']) !== FALSE, 'Message body is in sent message.');
+    $message_exploded = explode(PHP_EOL, $mail['body']);
+    $message_captured = trim($message_exploded[9] . ' ' . $message_exploded[10]);
+    $this->assertTrue(strcmp($message_captured, $message['message[0][value]']) !== FALSE, 'Message body is in sent message.');
 
     // Check there was no problems raised during sending.
     $this->drupalLogout();
@@ -103,6 +105,36 @@ public function testSendPersonalContactMessage() {
     $this->assertRaw(SafeMarkup::format('@sender_name (@sender_email) sent @recipient_name an email.', $placeholders));
     // Ensure an unescaped version of the email does not exist anywhere.
     $this->assertNoRaw($this->webUser->getEmail());
+
+    // Use custom testing mail system to support HTML mails.
+    $mail_config = $this->config('system.mail');
+    $mail_config->set('interface.default', 'test_html_mail_collector');
+    $mail_config->save();
+    // Test a subject that contains some common encoding characters.
+    $variables = [
+      '@site-name' => $this->config('system.site')->get('name'),
+      '@subject' => $message['subject[0][value]'],
+      '@recipient-name' => $this->contactUser->getUsername(),
+    ];
+    $subject = PlainTextOutput::renderFromHtml(t('[@site-name] @subject', $variables));
+    $message['message[0][value]'] = "This <i>is</i> a more <b>specific</b> <sup>test</sup>, I think the <a href='http://d8.dev'>emails</a> are formatted now.";
+    $this->drupalLogin($this->webUser);
+    $this->drupalPostForm('user/' . $this->contactUser->id() . '/contact', $message, t('Send message'));
+    $this->drupalLogin($this->adminUser);
+    $mails = $this->drupalGetMails();
+    $mail = $mails[1];
+    $this->assertEqual($mail['to'], $this->contactUser->getEmail());
+    $this->assertEqual($mail['from'], $this->config('system.site')->get('mail'));
+    $this->assertEqual($mail['reply-to'], $this->webUser->getEmail());
+    $this->assertEqual($mail['key'], 'user_mail');
+    $this->assertEqual($mail['subject'], $subject);
+    // Extract the message from the mail body.
+    $message_exploded = explode(PHP_EOL, $mail['body']);
+    $message_captured = trim($message_exploded[9]) . ' ' . trim($message_exploded[10]) . ' ' . trim($message_exploded[11]) . ' ' . trim($message_exploded[12]);
+    // Assert mail content.
+    $this->assertTrue(strpos($mail['body'], 'Hello ' . $variables['@recipient-name']) !== FALSE, 'Recipient name is in sent message.');
+    $this->assertTrue(strpos($mail['body'], $this->webUser->getUsername()) !== FALSE, 'Sender name is in sent message.');
+    $this->assertTrue(strcmp($message_captured, trim($message['message[0][value]'])), 'Message was found in mail.');
   }
 
   /**
@@ -313,8 +345,8 @@ protected function checkContactAccess($response, $contact_value = NULL) {
    */
   protected function submitPersonalContact(AccountInterface $account, array $message = []) {
     $message += [
-      'subject[0][value]' => $this->randomMachineName(16),
-      'message[0][value]' => $this->randomMachineName(64),
+      'message[0][value]' => $this->randomMachineName(64) . '< " =+ >',
+      'subject[0][value]' => $this->randomMachineName(16) . '< " =+ >',
     ];
     $this->drupalPostForm('user/' . $account->id() . '/contact', $message, t('Send message'));
     return $message;
