From 002ca62974f289b9490dbf6de2601847413a17c8 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Tue, 16 Aug 2022 18:16:43 +0000 Subject: [PATCH] =?UTF-8?q?Mail:=20Prevent=20the=20last=20character=20of?= =?UTF-8?q?=20names=20in=20=20=E2=80=9CFrom=E2=80=9D=20headers=20from=20be?= =?UTF-8?q?ing=20trimmed.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When extracting the email and name from a “From” header, the last character of the name is incorrectly trimmed when a space is not included between the name and the opening `<`. Though the space is required for the header to be compliant with RFC5322 (see https://www.rfc-editor.org/rfc/rfc5322#section-3.4), the absence of a space can be ignored here. PHPMailer accepts the name and email as separate parameters and constructs the header correctly later on. Props hakanca, mikehansenme, SergeyBiryukov, kovshenin, mattyrob, drewapicture, desrosj. Fixes #19847. git-svn-id: https://develop.svn.wordpress.org/trunk@53900 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/pluggable.php | 2 +- tests/phpunit/tests/mail.php | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/pluggable.php b/src/wp-includes/pluggable.php index 2ec21126e0..5ab3eef749 100644 --- a/src/wp-includes/pluggable.php +++ b/src/wp-includes/pluggable.php @@ -307,7 +307,7 @@ if ( ! function_exists( 'wp_mail' ) ) : if ( false !== $bracket_pos ) { // Text before the bracketed email is the "From" name. if ( $bracket_pos > 0 ) { - $from_name = substr( $content, 0, $bracket_pos - 1 ); + $from_name = substr( $content, 0, $bracket_pos ); $from_name = str_replace( '"', '', $from_name ); $from_name = trim( $from_name ); } diff --git a/tests/phpunit/tests/mail.php b/tests/phpunit/tests/mail.php index 718a585673..c130658e3f 100644 --- a/tests/phpunit/tests/mail.php +++ b/tests/phpunit/tests/mail.php @@ -193,6 +193,28 @@ class Tests_Mail extends WP_UnitTestCase { $this->assertStringContainsString( $expected, $mailer->get_sent()->header ); } + /** + * @ticket 19847 + */ + public function test_wp_mail_with_from_header_missing_space() { + $to = 'address@tld.com'; + $subject = 'Testing'; + $message = 'Test Message'; + $from = 'bar@example.com'; + $from_name = 'Foo'; + $headers = "From: {$from_name}<{$from}>"; + $corrected = "From: {$from_name} <{$from}>"; + + wp_mail( $to, $subject, $message, $headers ); + + $mailer = tests_retrieve_phpmailer_instance(); + // phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase + $this->assertSame( $from, $mailer->From ); + $this->assertSame( $from_name, $mailer->FromName ); + // phpcs:enable + $this->assertStringContainsString( $corrected, $mailer->get_sent()->header ); + } + /** * @ticket 30266 */