diff --git a/wp-content/plugins/smtp-mailer/main.php b/wp-content/plugins/smtp-mailer/main.php index 770bdf3..3480edc 100644 --- a/wp-content/plugins/smtp-mailer/main.php +++ b/wp-content/plugins/smtp-mailer/main.php @@ -1,7 +1,7 @@ 0 ) { - $from_name = substr( $content, 0, $bracket_pos - 1 ); - $from_name = str_replace( '"', '', $from_name ); - $from_name = trim( $from_name ); - } - - $from_email = substr( $content, $bracket_pos + 1 ); - $from_email = str_replace( '>', '', $from_email ); - $from_email = trim( $from_email ); - - // Avoid setting an empty $from_email. - } elseif ( '' !== trim( $content ) ) { - $from_email = trim( $content ); - } - break; - case 'content-type': - if ( strpos( $content, ';' ) !== false ) { - list( $type, $charset_content ) = explode( ';', $content ); - $content_type = trim( $type ); - if ( false !== stripos( $charset_content, 'charset=' ) ) { - $charset = trim( str_replace( array( 'charset=', '"' ), '', $charset_content ) ); - } elseif ( false !== stripos( $charset_content, 'boundary=' ) ) { - $boundary = trim( str_replace( array( 'BOUNDARY=', 'boundary=', '"' ), '', $charset_content ) ); - $charset = ''; - } - - // Avoid setting an empty $content_type. - } elseif ( '' !== trim( $content ) ) { - $content_type = trim( $content ); - } - break; - case 'cc': - $cc = array_merge( (array) $cc, explode( ',', $content ) ); - break; - case 'bcc': - $bcc = array_merge( (array) $bcc, explode( ',', $content ) ); - break; - case 'reply-to': - $reply_to = array_merge( (array) $reply_to, explode( ',', $content ) ); - break; - default: - // Add it to our grand headers array. - $headers[ trim( $name ) ] = trim( $content ); - break; - } - } - } - } - - // Empty out the values that may be set. - $phpmailer->clearAllRecipients(); - $phpmailer->clearAttachments(); - $phpmailer->clearCustomHeaders(); - $phpmailer->clearReplyTos(); - - // Set "From" name and email. - - // If we don't have a name from the input headers. - if ( ! isset( $from_name ) ) { - $from_name = $options['from_name'];//'WordPress'; - } - - /* - * If we don't have an email from the input headers, default to wordpress@$sitename - * Some hosts will block outgoing mail from this address if it doesn't exist, - * but there's no easy alternative. Defaulting to admin_email might appear to be - * another option, but some hosts may refuse to relay mail from an unknown domain. - * See https://core.trac.wordpress.org/ticket/5007. - */ - if ( ! isset( $from_email ) ) { - // Get the site domain and get rid of www. - $sitename = wp_parse_url( network_home_url(), PHP_URL_HOST ); - if ( 'www.' === substr( $sitename, 0, 4 ) ) { - $sitename = substr( $sitename, 4 ); - } - - $from_email = $options['from_email'];//'wordpress@' . $sitename; - } - - /** - * Filters the email address to send from. - * - * @since 2.2.0 - * - * @param string $from_email Email address to send from. - */ - $from_email = apply_filters( 'wp_mail_from', $from_email ); - - /** - * Filters the name to associate with the "from" email address. - * - * @since 2.3.0 - * - * @param string $from_name Name associated with the "from" email address. - */ - $from_name = apply_filters( 'wp_mail_from_name', $from_name ); - - try { - $phpmailer->setFrom( $from_email, $from_name, false ); - } catch ( PHPMailer\PHPMailer\Exception $e ) { - $mail_error_data = compact( 'to', 'subject', 'message', 'headers', 'attachments' ); - $mail_error_data['phpmailer_exception_code'] = $e->getCode(); - - /** 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; - - // Set destination addresses, using appropriate methods for handling addresses. - $address_headers = compact( 'to', 'cc', 'bcc', 'reply_to' ); - - foreach ( $address_headers as $address_header => $addresses ) { - if ( empty( $addresses ) ) { - continue; - } - - foreach ( (array) $addresses as $address ) { - try { - // Break $recipient into name and address parts if in the format "Foo ". - $recipient_name = ''; - - if ( preg_match( '/(.*)<(.+)>/', $address, $matches ) ) { - if ( count( $matches ) == 3 ) { - $recipient_name = $matches[1]; - $address = $matches[2]; - } - } - - switch ( $address_header ) { - case 'to': - $phpmailer->addAddress( $address, $recipient_name ); - break; - case 'cc': - $phpmailer->addCc( $address, $recipient_name ); - break; - case 'bcc': - $phpmailer->addBcc( $address, $recipient_name ); - break; - case 'reply_to': - $phpmailer->addReplyTo( $address, $recipient_name ); - break; - } - } catch ( PHPMailer\PHPMailer\Exception $e ) { - continue; - } - } - } - - // Tell PHPMailer to use SMTP - $phpmailer->isSMTP(); //$phpmailer->IsMail(); - // Set the hostname of the mail server - $phpmailer->Host = $options['smtp_host']; - // Whether to use SMTP authentication - if(isset($options['smtp_auth']) && $options['smtp_auth'] == "true"){ - $phpmailer->SMTPAuth = true; - // SMTP username - $phpmailer->Username = $options['smtp_username']; - // SMTP password - $phpmailer->Password = base64_decode($options['smtp_password']); - } - // Whether to use encryption - $type_of_encryption = $options['type_of_encryption']; - if($type_of_encryption=="none"){ - $type_of_encryption = ''; - } - $phpmailer->SMTPSecure = $type_of_encryption; - // SMTP port - $phpmailer->Port = $options['smtp_port']; - - // Whether to enable TLS encryption automatically if a server supports it - $phpmailer->SMTPAutoTLS = false; - //enable debug when sending a test mail - if(isset($_POST['smtp_mailer_send_test_email'])){ - $phpmailer->SMTPDebug = 4; - // Ask for HTML-friendly debug output - $phpmailer->Debugoutput = 'html'; - } - - //disable ssl certificate verification if checked - if(isset($options['disable_ssl_verification']) && !empty($options['disable_ssl_verification'])){ - $phpmailer->SMTPOptions = array( - 'ssl' => array( - 'verify_peer' => false, - 'verify_peer_name' => false, - 'allow_self_signed' => true - ) - ); - } - - // Set Content-Type and charset. - - // If we don't have a content-type from the input headers. - if ( ! isset( $content_type ) ) { - $content_type = 'text/plain'; - } - - /** - * Filters the wp_mail() content type. - * - * @since 2.3.0 - * - * @param string $content_type Default wp_mail() content type. - */ - $content_type = apply_filters( 'wp_mail_content_type', $content_type ); - - $phpmailer->ContentType = $content_type; - - // Set whether it's plaintext, depending on $content_type. - if ( 'text/html' === $content_type ) { - $phpmailer->isHTML( true ); - } - - // If we don't have a charset from the input headers. - if ( ! isset( $charset ) ) { - $charset = get_bloginfo( 'charset' ); - } - - /** - * Filters the default wp_mail() charset. - * - * @since 2.3.0 - * - * @param string $charset Default email charset. - */ - $phpmailer->CharSet = apply_filters( 'wp_mail_charset', $charset ); - - // Set custom headers. - if ( ! empty( $headers ) ) { - foreach ( (array) $headers as $name => $content ) { - // Only add custom headers not added automatically by PHPMailer. - if ( ! in_array( $name, array( 'MIME-Version', 'X-Mailer' ), true ) ) { - try { - $phpmailer->addCustomHeader( sprintf( '%1$s: %2$s', $name, $content ) ); - } catch ( PHPMailer\PHPMailer\Exception $e ) { - continue; - } - } - } - - if ( false !== stripos( $content_type, 'multipart' ) && ! empty( $boundary ) ) { - $phpmailer->addCustomHeader( sprintf( 'Content-Type: %s; boundary="%s"', $content_type, $boundary ) ); - } - } - - if ( ! empty( $attachments ) ) { - foreach ( $attachments as $attachment ) { - try { - $phpmailer->addAttachment( $attachment ); - } catch ( PHPMailer\PHPMailer\Exception $e ) { - continue; - } - } - } - - /** - * Fires after PHPMailer is initialized. - * - * @since 2.2.0 - * - * @param PHPMailer $phpmailer The PHPMailer instance (passed by reference). - */ - do_action_ref_array( 'phpmailer_init', array( &$phpmailer ) ); - - // Send! - try { - return $phpmailer->send(); - } catch ( PHPMailer\PHPMailer\Exception $e ) { - - $mail_error_data = compact( 'to', 'subject', 'message', 'headers', 'attachments' ); - $mail_error_data['phpmailer_exception_code'] = $e->getCode(); - - /** - * Fires after a PHPMailer\PHPMailer\Exception is caught. - * - * @since 4.4.0 - * - * @param WP_Error $error A WP_Error object with the PHPMailer\PHPMailer\Exception message, and an array - * containing the mail recipient, subject, message, headers, and attachments. - */ - do_action( 'wp_mail_failed', new WP_Error( 'wp_mail_failed', $e->getMessage(), $mail_error_data ) ); - - return false; - } - } + if ( ! is_array( $attachments ) ) { + $attachments = explode( "\n", str_replace( "\r\n", "\n", $attachments ) ); + } + $options = smtp_mailer_get_option(); + + global $phpmailer; + + // (Re)create it, if it's gone missing. + if ( ! ( $phpmailer instanceof PHPMailer\PHPMailer\PHPMailer ) ) { + require_once ABSPATH . WPINC . '/PHPMailer/PHPMailer.php'; + require_once ABSPATH . WPINC . '/PHPMailer/SMTP.php'; + require_once ABSPATH . WPINC . '/PHPMailer/Exception.php'; + $phpmailer = new PHPMailer\PHPMailer\PHPMailer( true ); + + $phpmailer::$validator = static function ( $email ) { + return (bool) is_email( $email ); + }; + } + + // Headers. + $cc = array(); + $bcc = array(); + $reply_to = array(); + + if ( empty( $headers ) ) { + $headers = array(); + } else { + if ( ! is_array( $headers ) ) { + // Explode the headers out, so this function can take + // both string headers and an array of headers. + $tempheaders = explode( "\n", str_replace( "\r\n", "\n", $headers ) ); + } else { + $tempheaders = $headers; + } + $headers = array(); + + // If it's actually got contents. + if ( ! empty( $tempheaders ) ) { + // Iterate through the raw headers. + foreach ( (array) $tempheaders as $header ) { + if ( strpos( $header, ':' ) === false ) { + if ( false !== stripos( $header, 'boundary=' ) ) { + $parts = preg_split( '/boundary=/i', trim( $header ) ); + $boundary = trim( str_replace( array( "'", '"' ), '', $parts[1] ) ); + } + continue; + } + // Explode them out. + list( $name, $content ) = explode( ':', trim( $header ), 2 ); + + // Cleanup crew. + $name = trim( $name ); + $content = trim( $content ); + + switch ( strtolower( $name ) ) { + // Mainly for legacy -- process a "From:" header if it's there. + case 'from': + $bracket_pos = strpos( $content, '<' ); + 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 = str_replace( '"', '', $from_name ); + $from_name = trim( $from_name ); + } + + $from_email = substr( $content, $bracket_pos + 1 ); + $from_email = str_replace( '>', '', $from_email ); + $from_email = trim( $from_email ); + + // Avoid setting an empty $from_email. + } elseif ( '' !== trim( $content ) ) { + $from_email = trim( $content ); + } + break; + case 'content-type': + if ( strpos( $content, ';' ) !== false ) { + list( $type, $charset_content ) = explode( ';', $content ); + $content_type = trim( $type ); + if ( false !== stripos( $charset_content, 'charset=' ) ) { + $charset = trim( str_replace( array( 'charset=', '"' ), '', $charset_content ) ); + } elseif ( false !== stripos( $charset_content, 'boundary=' ) ) { + $boundary = trim( str_replace( array( 'BOUNDARY=', 'boundary=', '"' ), '', $charset_content ) ); + $charset = ''; + } + + // Avoid setting an empty $content_type. + } elseif ( '' !== trim( $content ) ) { + $content_type = trim( $content ); + } + break; + case 'cc': + $cc = array_merge( (array) $cc, explode( ',', $content ) ); + break; + case 'bcc': + $bcc = array_merge( (array) $bcc, explode( ',', $content ) ); + break; + case 'reply-to': + $reply_to = array_merge( (array) $reply_to, explode( ',', $content ) ); + break; + default: + // Add it to our grand headers array. + $headers[ trim( $name ) ] = trim( $content ); + break; + } + } + } + } + + // Empty out the values that may be set. + $phpmailer->clearAllRecipients(); + $phpmailer->clearAttachments(); + $phpmailer->clearCustomHeaders(); + $phpmailer->clearReplyTos(); + + // Set "From" name and email. + + // If we don't have a name from the input headers. + if ( ! isset( $from_name ) ) { + $from_name = $options['from_name'];//'WordPress'; + } + + /* + * If we don't have an email from the input headers, default to wordpress@$sitename + * Some hosts will block outgoing mail from this address if it doesn't exist, + * but there's no easy alternative. Defaulting to admin_email might appear to be + * another option, but some hosts may refuse to relay mail from an unknown domain. + * See https://core.trac.wordpress.org/ticket/5007. + */ + if ( ! isset( $from_email ) ) { + // Get the site domain and get rid of www. + $sitename = wp_parse_url( network_home_url(), PHP_URL_HOST ); + if ( 'www.' === substr( $sitename, 0, 4 ) ) { + $sitename = substr( $sitename, 4 ); + } + + $from_email = $options['from_email'];//'wordpress@' . $sitename; + } + + /** + * Filters the email address to send from. + * + * @since 2.2.0 + * + * @param string $from_email Email address to send from. + */ + $from_email = apply_filters( 'wp_mail_from', $from_email ); + + /** + * Filters the name to associate with the "from" email address. + * + * @since 2.3.0 + * + * @param string $from_name Name associated with the "from" email address. + */ + $from_name = apply_filters( 'wp_mail_from_name', $from_name ); + + try { + $phpmailer->setFrom( $from_email, $from_name, false ); + } catch ( PHPMailer\PHPMailer\Exception $e ) { + $mail_error_data = compact( 'to', 'subject', 'message', 'headers', 'attachments' ); + $mail_error_data['phpmailer_exception_code'] = $e->getCode(); + + /** 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; + + // Set destination addresses, using appropriate methods for handling addresses. + $address_headers = compact( 'to', 'cc', 'bcc', 'reply_to' ); + + foreach ( $address_headers as $address_header => $addresses ) { + if ( empty( $addresses ) ) { + continue; + } + + foreach ( (array) $addresses as $address ) { + try { + // Break $recipient into name and address parts if in the format "Foo ". + $recipient_name = ''; + + if ( preg_match( '/(.*)<(.+)>/', $address, $matches ) ) { + if ( count( $matches ) == 3 ) { + $recipient_name = $matches[1]; + $address = $matches[2]; + } + } + + switch ( $address_header ) { + case 'to': + $phpmailer->addAddress( $address, $recipient_name ); + break; + case 'cc': + $phpmailer->addCc( $address, $recipient_name ); + break; + case 'bcc': + $phpmailer->addBcc( $address, $recipient_name ); + break; + case 'reply_to': + $phpmailer->addReplyTo( $address, $recipient_name ); + break; + } + } catch ( PHPMailer\PHPMailer\Exception $e ) { + continue; + } + } + } + + // Tell PHPMailer to use SMTP + $phpmailer->isSMTP(); //$phpmailer->isMail(); + // Set the hostname of the mail server + $phpmailer->Host = $options['smtp_host']; + // Whether to use SMTP authentication + if(isset($options['smtp_auth']) && $options['smtp_auth'] == "true"){ + $phpmailer->SMTPAuth = true; + // SMTP username + $phpmailer->Username = $options['smtp_username']; + // SMTP password + $phpmailer->Password = base64_decode($options['smtp_password']); + } + // Whether to use encryption + $type_of_encryption = $options['type_of_encryption']; + if($type_of_encryption=="none"){ + $type_of_encryption = ''; + } + $phpmailer->SMTPSecure = $type_of_encryption; + // SMTP port + $phpmailer->Port = $options['smtp_port']; + + // Whether to enable TLS encryption automatically if a server supports it + $phpmailer->SMTPAutoTLS = false; + //enable debug when sending a test mail + if(isset($_POST['smtp_mailer_send_test_email'])){ + $phpmailer->SMTPDebug = 4; + // Ask for HTML-friendly debug output + $phpmailer->Debugoutput = 'html'; + } + + //disable ssl certificate verification if checked + if(isset($options['disable_ssl_verification']) && !empty($options['disable_ssl_verification'])){ + $phpmailer->SMTPOptions = array( + 'ssl' => array( + 'verify_peer' => false, + 'verify_peer_name' => false, + 'allow_self_signed' => true + ) + ); + } + // Set Content-Type and charset. + + // If we don't have a content-type from the input headers. + if ( ! isset( $content_type ) ) { + $content_type = 'text/plain'; + } + + /** + * Filters the wp_mail() content type. + * + * @since 2.3.0 + * + * @param string $content_type Default wp_mail() content type. + */ + $content_type = apply_filters( 'wp_mail_content_type', $content_type ); + + $phpmailer->ContentType = $content_type; + + // Set whether it's plaintext, depending on $content_type. + if ( 'text/html' === $content_type ) { + $phpmailer->isHTML( true ); + } + + // If we don't have a charset from the input headers. + if ( ! isset( $charset ) ) { + $charset = get_bloginfo( 'charset' ); + } + + /** + * Filters the default wp_mail() charset. + * + * @since 2.3.0 + * + * @param string $charset Default email charset. + */ + $phpmailer->CharSet = apply_filters( 'wp_mail_charset', $charset ); + + // Set custom headers. + if ( ! empty( $headers ) ) { + foreach ( (array) $headers as $name => $content ) { + // Only add custom headers not added automatically by PHPMailer. + if ( ! in_array( $name, array( 'MIME-Version', 'X-Mailer' ), true ) ) { + try { + $phpmailer->addCustomHeader( sprintf( '%1$s: %2$s', $name, $content ) ); + } catch ( PHPMailer\PHPMailer\Exception $e ) { + continue; + } + } + } + + if ( false !== stripos( $content_type, 'multipart' ) && ! empty( $boundary ) ) { + $phpmailer->addCustomHeader( sprintf( 'Content-Type: %s; boundary="%s"', $content_type, $boundary ) ); + } + } + + if ( ! empty( $attachments ) ) { + foreach ( $attachments as $attachment ) { + try { + $phpmailer->addAttachment( $attachment ); + } catch ( PHPMailer\PHPMailer\Exception $e ) { + continue; + } + } + } + + /** + * Fires after PHPMailer is initialized. + * + * @since 2.2.0 + * + * @param PHPMailer $phpmailer The PHPMailer instance (passed by reference). + */ + do_action_ref_array( 'phpmailer_init', array( &$phpmailer ) ); + + // Send! + try { + return $phpmailer->send(); + } catch ( PHPMailer\PHPMailer\Exception $e ) { + + $mail_error_data = compact( 'to', 'subject', 'message', 'headers', 'attachments' ); + $mail_error_data['phpmailer_exception_code'] = $e->getCode(); + + /** + * Fires after a PHPMailer\PHPMailer\Exception is caught. + * + * @since 4.4.0 + * + * @param WP_Error $error A WP_Error object with the PHPMailer\PHPMailer\Exception message, and an array + * containing the mail recipient, subject, message, headers, and attachments. + */ + do_action( 'wp_mail_failed', new WP_Error( 'wp_mail_failed', $e->getMessage(), $mail_error_data ) ); + + return false; + } } diff --git a/wp-content/plugins/smtp-mailer/readme.txt b/wp-content/plugins/smtp-mailer/readme.txt index e505aa2..bca29ef 100644 --- a/wp-content/plugins/smtp-mailer/readme.txt +++ b/wp-content/plugins/smtp-mailer/readme.txt @@ -2,9 +2,9 @@ Contributors: naa986 Donate link: https://wphowto.net/ Tags: email, mail, smtp, phpmailer -Requires at least: 5.5 +Requires at least: 5.7 Tested up to: 5.7 -Stable tag: 1.1.0 +Stable tag: 1.1.1 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html @@ -107,6 +107,9 @@ none == Changelog == += 1.1.1 = +* WordPress 5.7 compatibility update. + = 1.1.0 = * The password field can be left empty when updating the settings.