From 247e08e84a2a28273e3da4732f1914d209429a3b Mon Sep 17 00:00:00 2001 From: Dion Hulse Date: Fri, 30 Dec 2016 06:43:07 +0000 Subject: [PATCH] Mail: Ensure that any `phpmailerException` exceptions generated by `setFrom()` are caught to avoid PHP Fatal errors. This change avoids a PHP fatal error that can be encountered when the specified (or generated) source email is an invalid address, such as `wordpress@_`, it makes no effort to set a valid source, only avoid the fatal error. See #25239 for correcting the email address. Fixes #39360. git-svn-id: https://develop.svn.wordpress.org/trunk@39655 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/pluggable.php | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/wp-includes/pluggable.php b/src/wp-includes/pluggable.php index 2d76e73e6c..aa9b1adf47 100644 --- a/src/wp-includes/pluggable.php +++ b/src/wp-includes/pluggable.php @@ -187,6 +187,10 @@ function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() $to = $atts['to']; } + if ( !is_array( $to ) ) { + $to = explode( ',', $to ); + } + if ( isset( $atts['subject'] ) ) { $subject = $atts['subject']; } @@ -349,17 +353,23 @@ function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() */ $from_name = apply_filters( 'wp_mail_from_name', $from_name ); - $phpmailer->setFrom( $from_email, $from_name, false ); + try { + $phpmailer->setFrom( $from_email, $from_name, false ); + } catch ( phpmailerException $e ) { + $mail_error_data = compact( 'to', 'subject', 'message', 'headers', 'attachments' ); + $mail_error_data['phpmailer_exception_code'] = $e->getCode(); - // Set destination addresses - if ( !is_array( $to ) ) - $to = explode( ',', $to ); + /** This filter is documented in wp-includes/pluggable.php */ + do_action( 'wp_mail_failed', new WP_Error( 'wp_mail_failed', $e->getMessage(), $mail_error_data ) ); + + return false; + } // Set mail's subject and body $phpmailer->Subject = $subject; $phpmailer->Body = $message; - // Use appropriate methods for handling addresses, rather than treating them as generic headers + // Set destination addresses, using appropriate methods for handling addresses $address_headers = compact( 'to', 'cc', 'bcc', 'reply_to' ); foreach ( $address_headers as $address_header => $addresses ) {