Make WordPress Core

Changeset 61131


Ignore:
Timestamp:
11/04/2025 05:18:55 PM (10 days ago)
Author:
johnjamesjacoby
Message:

Mail: reset Encoding to 8-bit in wp_mail().

The PHPMailer library may automatically switch its encoding based on various internal factors.

This commit fixes a bug where the $phpmailer global was unintentionally persisting its Encoding property from the first wp_mail() call to all subsequent calls.

This includes unit tests to verify the fix is accurate, and a change to the mock-mailer helper that worked around this bug just-in-time when running the test suite.

Props codebuddy, dilip2615, rishabhwp, sajjad67, sirlouen, stephenharris.

Fixes #33972.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/pluggable.php

    r61038 r61131  
    384384        $phpmailer->Body    = '';
    385385        $phpmailer->AltBody = '';
     386
     387        /*
     388         * Reset encoding to 8-bit, as it may have been automatically downgraded
     389         * to 7-bit by PHPMailer (based on the body contents) in a previous call
     390         * to wp_mail().
     391         *
     392         * See https://core.trac.wordpress.org/ticket/33972
     393         */
     394        $phpmailer->Encoding = PHPMailer\PHPMailer\PHPMailer::ENCODING_8BIT;
    386395
    387396        // Set "From" name and email.
  • trunk/tests/phpunit/includes/mock-mailer.php

    r59592 r61131  
    2121
    2222    public function preSend() {
    23         $this->Encoding = '8bit';
    2423        return parent::preSend();
    2524    }
  • trunk/tests/phpunit/tests/pluggable/wpMail.php

    r61025 r61131  
    652652        }
    653653    }
     654
     655    /**
     656     * Test that the encoding of the email does not bleed between long and short emails.
     657     *
     658     * @ticket 33972
     659     */
     660    public function test_wp_mail_encoding_does_not_bleed() {
     661        $content = str_repeat( 'A', 1000 );
     662        wp_mail( WP_TESTS_EMAIL, 'Looong line testing', $content );
     663
     664        $mailer = tests_retrieve_phpmailer_instance();
     665        $this->assertEquals( 'quoted-printable', $mailer->Encoding );
     666
     667        wp_mail( WP_TESTS_EMAIL, 'A follow up short email', 'Short email' );
     668
     669        $mailer = tests_retrieve_phpmailer_instance();
     670        $this->assertEquals( '7bit', $mailer->Encoding );
     671    }
    654672}
Note: See TracChangeset for help on using the changeset viewer.