Mail: Prevent the last character of names in “From” headers from being trimmed.

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
This commit is contained in:
Jonathan Desrosiers 2022-08-16 18:16:43 +00:00
parent c5b4cd8921
commit 002ca62974
2 changed files with 23 additions and 1 deletions

View File

@ -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 );
}

View File

@ -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
*/