WordPress.org

Make WordPress Core

Ticket #21659: 21659.3.diff

File 21659.3.diff, 4.4 KB (added by iandunn, 3 years ago)
  • src/wp-includes/pluggable.php

    diff --git src/wp-includes/pluggable.php src/wp-includes/pluggable.php
    index 8b64359..68c9148 100644
    function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() 
    227227                        $tempheaders = $headers;
    228228                }
    229229                $headers = array();
    230                 $cc = array();
    231                 $bcc = array();
     230                $cc = $bcc = $reply_to = array();
    232231
    233232                // If it's actually got contents
    234233                if ( !empty( $tempheaders ) ) {
    function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() 
    286285                                                }
    287286                                                break;
    288287                                        case 'cc':
    289                                                 $cc = array_merge( (array) $cc, explode( ',', $content ) );
    290                                                 break;
    291288                                        case 'bcc':
    292                                                 $bcc = array_merge( (array) $bcc, explode( ',', $content ) );
     289                                        case 'reply-to':
     290                                                // Update the existing variable (e.g., $cc, $bcc, $reply_to) from the passed header
     291                                                $header_variable  = str_replace( '-', '_', strtolower( $name ) );
     292                                                $$header_variable = array_merge( (array) $$header_variable, explode( ',', $content ) );
    293293                                                break;
    294294                                        default:
    295295                                                // Add it to our grand headers array
    function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() 
    335335         *
    336336         * @param string $from_email Email address to send from.
    337337         */
    338         $phpmailer->From = apply_filters( 'wp_mail_from', $from_email );
     338        $from_email = apply_filters( 'wp_mail_from', $from_email );
    339339
    340340        /**
    341341         * Filters the name to associate with the "from" email address.
    function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() 
    344344         *
    345345         * @param string $from_name Name associated with the "from" email address.
    346346         */
    347         $phpmailer->FromName = apply_filters( 'wp_mail_from_name', $from_name );
     347        $from_name = apply_filters( 'wp_mail_from_name', $from_name );
     348
     349        $phpmailer->setFrom( $from_email, $from_name );
    348350
    349351        // Set destination addresses
    350352        if ( !is_array( $to ) )
    351353                $to = explode( ',', $to );
    352354
    353         foreach ( (array) $to as $recipient ) {
    354                 try {
    355                         // Break $recipient into name and address parts if in the format "Foo <bar@baz.com>"
    356                         $recipient_name = '';
    357                         if ( preg_match( '/(.*)<(.+)>/', $recipient, $matches ) ) {
    358                                 if ( count( $matches ) == 3 ) {
    359                                         $recipient_name = $matches[1];
    360                                         $recipient = $matches[2];
    361                                 }
    362                         }
    363                         $phpmailer->AddAddress( $recipient, $recipient_name);
    364                 } catch ( phpmailerException $e ) {
    365                         continue;
    366                 }
    367         }
    368 
    369355        // Set mail's subject and body
    370356        $phpmailer->Subject = $subject;
    371357        $phpmailer->Body    = $message;
    372358
    373         // Add any CC and BCC recipients
    374         if ( !empty( $cc ) ) {
    375                 foreach ( (array) $cc as $recipient ) {
    376                         try {
    377                                 // Break $recipient into name and address parts if in the format "Foo <bar@baz.com>"
    378                                 $recipient_name = '';
    379                                 if ( preg_match( '/(.*)<(.+)>/', $recipient, $matches ) ) {
    380                                         if ( count( $matches ) == 3 ) {
    381                                                 $recipient_name = $matches[1];
    382                                                 $recipient = $matches[2];
    383                                         }
    384                                 }
    385                                 $phpmailer->AddCc( $recipient, $recipient_name );
    386                         } catch ( phpmailerException $e ) {
    387                                 continue;
    388                         }
    389                 }
    390         }
     359        // Use appropriate methods for handling addresses, rather than treating them as generic headers
     360        $header_method_map = array(
     361                'to'       => 'AddAddress',
     362                'cc'       => 'AddCc',
     363                'bcc'      => 'AddBcc',
     364                'reply_to' => 'AddReplyTo'
     365        );
    391366
    392         if ( !empty( $bcc ) ) {
    393                 foreach ( (array) $bcc as $recipient) {
    394                         try {
    395                                 // Break $recipient into name and address parts if in the format "Foo <bar@baz.com>"
    396                                 $recipient_name = '';
    397                                 if ( preg_match( '/(.*)<(.+)>/', $recipient, $matches ) ) {
    398                                         if ( count( $matches ) == 3 ) {
    399                                                 $recipient_name = $matches[1];
    400                                                 $recipient = $matches[2];
     367        foreach ( $header_method_map as $address_header => $address_handler ) {
     368                if ( ! empty( $$address_header ) ) {
     369                        foreach ( (array) $$address_header as $address ) {
     370                                try {
     371                                        // Break $recipient into name and address parts if in the format "Foo <bar@baz.com>"
     372                                        $recipient_name = '';
     373
     374                                        if ( preg_match( '/(.*)<(.+)>/', $address, $matches ) ) {
     375                                                if ( count( $matches ) == 3 ) {
     376                                                        $recipient_name = $matches[1];
     377                                                        $address        = $matches[2];
     378                                                }
    401379                                        }
     380
     381                                        call_user_func( array( $phpmailer, $address_handler ), $address, $recipient_name );
     382                                } catch ( phpmailerException $e ) {
     383                                        continue;
    402384                                }
    403                                 $phpmailer->AddBcc( $recipient, $recipient_name );
    404                         } catch ( phpmailerException $e ) {
    405                                 continue;
    406385                        }
    407386                }
    408387        }