From 1e5f032e26cf399ae3bfe793b322cf1520d4e421 Mon Sep 17 00:00:00 2001 From: Dave Long <dave@longwaveconsulting.com> Date: Mon, 22 Jul 2024 11:08:38 +0100 Subject: [PATCH] Issue #3451611 by mfb, xjm, smustgrave, quietone: Fix the format=flowed; delsp=yes encoding of email messages (cherry picked from commit c29768f4068611be2c81a99697a85b694a5621b5) --- core/lib/Drupal/Core/Mail/MailFormatHelper.php | 2 +- core/lib/Drupal/Core/Mail/Plugin/Mail/PhpMail.php | 4 +--- core/lib/Drupal/Core/Mail/Plugin/Mail/SymfonyMailer.php | 5 ++++- core/tests/Drupal/Tests/Core/Mail/MailFormatHelperTest.php | 7 +++++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/core/lib/Drupal/Core/Mail/MailFormatHelper.php b/core/lib/Drupal/Core/Mail/MailFormatHelper.php index c3fc206721f9..05e4c190933a 100644 --- a/core/lib/Drupal/Core/Mail/MailFormatHelper.php +++ b/core/lib/Drupal/Core/Mail/MailFormatHelper.php @@ -311,7 +311,7 @@ protected static function wrapMailLine(&$line, $key, $values) { } if (!$line_is_mime_header) { // Use soft-breaks only for purely quoted or un-indented text. - $line = wordwrap($line, 77 - $values['length'], $values['soft'] ? " \n" : "\n"); + $line = wordwrap($line, 77 - $values['length'], $values['soft'] ? " \n" : "\n"); } // Break really long words at the maximum width allowed. $line = wordwrap($line, 996 - $values['length'], $values['soft'] ? " \n" : "\n", TRUE); diff --git a/core/lib/Drupal/Core/Mail/Plugin/Mail/PhpMail.php b/core/lib/Drupal/Core/Mail/Plugin/Mail/PhpMail.php index 809420759969..a578a0246390 100644 --- a/core/lib/Drupal/Core/Mail/Plugin/Mail/PhpMail.php +++ b/core/lib/Drupal/Core/Mail/Plugin/Mail/PhpMail.php @@ -64,10 +64,8 @@ public function format(array $message) { // Join the body array into one string. $message['body'] = implode("\n\n", $message['body']); - // Convert any HTML to plain-text. + // Convert any HTML to plain text (which also wraps the mail body). $message['body'] = MailFormatHelper::htmlToText($message['body']); - // Wrap the mail body for sending. - $message['body'] = MailFormatHelper::wrapMail($message['body']); return $message; } diff --git a/core/lib/Drupal/Core/Mail/Plugin/Mail/SymfonyMailer.php b/core/lib/Drupal/Core/Mail/Plugin/Mail/SymfonyMailer.php index c848a0a43108..80b545465e42 100644 --- a/core/lib/Drupal/Core/Mail/Plugin/Mail/SymfonyMailer.php +++ b/core/lib/Drupal/Core/Mail/Plugin/Mail/SymfonyMailer.php @@ -98,11 +98,14 @@ public function __construct( } public function format(array $message) { - // Convert any HTML to plain-text. foreach ($message['body'] as &$part) { + // If the message contains HTML, convert it to plain text (which also + // wraps the mail body). if ($part instanceof MarkupInterface) { $part = MailFormatHelper::htmlToText($part); } + // If the message does not contain HTML, it still needs to be wrapped + // properly. else { $part = MailFormatHelper::wrapMail($part); } diff --git a/core/tests/Drupal/Tests/Core/Mail/MailFormatHelperTest.php b/core/tests/Drupal/Tests/Core/Mail/MailFormatHelperTest.php index 4dc849147638..2232be3394b0 100644 --- a/core/tests/Drupal/Tests/Core/Mail/MailFormatHelperTest.php +++ b/core/tests/Drupal/Tests/Core/Mail/MailFormatHelperTest.php @@ -32,8 +32,11 @@ public function testWrapMail(): void { // Check that the body headers were not wrapped even though some exceeded // 77 characters. $this->assertEquals($headers_in_body, $processed_headers, 'Headers in the body are not wrapped.'); - // Check that the body text is wrapped. - $this->assertEquals(wordwrap($body, 77, " \n"), $processed_body, 'Body text is wrapped.'); + // Check that the body text is soft-wrapped according to the + // "format=flowed; delsp=yes" encoding. When interpreting this encoding, + // mail readers will delete a space at the end of the line; therefore an + // extra trailing space should be present in the raw body (see RFC 3676). + $this->assertEquals(wordwrap($body, 77, " \n"), $processed_body, 'Body text is soft-wrapped.'); } } -- GitLab