updated plugin SMTP Mailer
version 1.1.1
This commit is contained in:
parent
a366a73cba
commit
a27d917629
@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
Plugin Name: SMTP Mailer
|
Plugin Name: SMTP Mailer
|
||||||
Version: 1.1.0
|
Version: 1.1.1
|
||||||
Plugin URI: https://wphowto.net/smtp-mailer-plugin-for-wordpress-1482
|
Plugin URI: https://wphowto.net/smtp-mailer-plugin-for-wordpress-1482
|
||||||
Author: naa986
|
Author: naa986
|
||||||
Author URI: https://wphowto.net/
|
Author URI: https://wphowto.net/
|
||||||
@ -16,8 +16,8 @@ if (!defined('ABSPATH')){
|
|||||||
|
|
||||||
class SMTP_MAILER {
|
class SMTP_MAILER {
|
||||||
|
|
||||||
var $plugin_version = '1.1.0';
|
var $plugin_version = '1.1.1';
|
||||||
var $phpmailer_version = '6.1.6';
|
var $phpmailer_version = '6.3.0';
|
||||||
var $plugin_url;
|
var $plugin_url;
|
||||||
var $plugin_path;
|
var $plugin_path;
|
||||||
|
|
||||||
@ -42,6 +42,7 @@ class SMTP_MAILER {
|
|||||||
add_action('plugins_loaded', array($this, 'plugins_loaded_handler'));
|
add_action('plugins_loaded', array($this, 'plugins_loaded_handler'));
|
||||||
add_action('admin_menu', array($this, 'options_menu'));
|
add_action('admin_menu', array($this, 'options_menu'));
|
||||||
add_action('admin_notices', 'smtp_mailer_admin_notice');
|
add_action('admin_notices', 'smtp_mailer_admin_notice');
|
||||||
|
add_filter('pre_wp_mail', 'smtp_mailer_pre_wp_mail', 10, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
function plugins_loaded_handler()
|
function plugins_loaded_handler()
|
||||||
@ -442,394 +443,378 @@ function is_smtp_mailer_configured() {
|
|||||||
|
|
||||||
$GLOBALS['smtp_mailer'] = new SMTP_MAILER();
|
$GLOBALS['smtp_mailer'] = new SMTP_MAILER();
|
||||||
|
|
||||||
if(!function_exists('wp_mail') && is_smtp_mailer_configured()){
|
function smtp_mailer_pre_wp_mail($null, $atts)
|
||||||
|
{
|
||||||
|
if ( isset( $atts['to'] ) ) {
|
||||||
|
$to = $atts['to'];
|
||||||
|
}
|
||||||
|
|
||||||
function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() ) {
|
if ( ! is_array( $to ) ) {
|
||||||
// Compact the input, apply the filters, and extract them back out.
|
$to = explode( ',', $to );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
if ( isset( $atts['subject'] ) ) {
|
||||||
* Filters the wp_mail() arguments.
|
$subject = $atts['subject'];
|
||||||
*
|
}
|
||||||
* @since 2.2.0
|
|
||||||
*
|
|
||||||
* @param array $args A compacted array of wp_mail() arguments, including the "to" email,
|
|
||||||
* subject, message, headers, and attachments values.
|
|
||||||
*/
|
|
||||||
$atts = apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers', 'attachments' ) );
|
|
||||||
|
|
||||||
if ( isset( $atts['to'] ) ) {
|
if ( isset( $atts['message'] ) ) {
|
||||||
$to = $atts['to'];
|
$message = $atts['message'];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! is_array( $to ) ) {
|
if ( isset( $atts['headers'] ) ) {
|
||||||
$to = explode( ',', $to );
|
$headers = $atts['headers'];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( isset( $atts['subject'] ) ) {
|
if ( isset( $atts['attachments'] ) ) {
|
||||||
$subject = $atts['subject'];
|
$attachments = $atts['attachments'];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( isset( $atts['message'] ) ) {
|
if ( ! is_array( $attachments ) ) {
|
||||||
$message = $atts['message'];
|
$attachments = explode( "\n", str_replace( "\r\n", "\n", $attachments ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( isset( $atts['headers'] ) ) {
|
|
||||||
$headers = $atts['headers'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isset( $atts['attachments'] ) ) {
|
|
||||||
$attachments = $atts['attachments'];
|
|
||||||
}
|
|
||||||
|
|
||||||
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 <bar@baz.com>".
|
|
||||||
$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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
$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 <bar@baz.com>".
|
||||||
|
$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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
Contributors: naa986
|
Contributors: naa986
|
||||||
Donate link: https://wphowto.net/
|
Donate link: https://wphowto.net/
|
||||||
Tags: email, mail, smtp, phpmailer
|
Tags: email, mail, smtp, phpmailer
|
||||||
Requires at least: 5.5
|
Requires at least: 5.7
|
||||||
Tested up to: 5.7
|
Tested up to: 5.7
|
||||||
Stable tag: 1.1.0
|
Stable tag: 1.1.1
|
||||||
License: GPLv2 or later
|
License: GPLv2 or later
|
||||||
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
||||||
|
|
||||||
@ -107,6 +107,9 @@ none
|
|||||||
|
|
||||||
== Changelog ==
|
== Changelog ==
|
||||||
|
|
||||||
|
= 1.1.1 =
|
||||||
|
* WordPress 5.7 compatibility update.
|
||||||
|
|
||||||
= 1.1.0 =
|
= 1.1.0 =
|
||||||
* The password field can be left empty when updating the settings.
|
* The password field can be left empty when updating the settings.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user