-
Notifications
You must be signed in to change notification settings - Fork 28
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Fixed: WordPress 5.5 compatibility * Fixed: Email log filtering * Fixed: Pushover notifications * New: Suggest solution for email delivery errors
- Loading branch information
smusman98
committed
Jul 18, 2022
1 parent
028fa70
commit 59c5658
Showing
24 changed files
with
481 additions
and
269 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -37,4 +37,4 @@ public function send_message($message) | |
error_log( __CLASS__ . ': ' . $message ); | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
<?php | ||
|
||
class StatusSolution { | ||
|
||
private $status; | ||
|
||
public function __construct() { | ||
add_filter( 'post_smtp_log_solution', array( $this, 'find_solution' ), 10, 4 ); | ||
} | ||
|
||
public function find_solution( $solution, $status, $log, $message ) { | ||
|
||
if ( empty( $status ) ) { | ||
return 'All good, mail sent.'; | ||
} | ||
|
||
$this->status = addslashes( $status ); | ||
$possible_solution = []; | ||
|
||
if ( $this->strExists('timed out') ) { | ||
$possible_solution[] = $this->make_clickable('https://postmansmtp.com/office365-smtp-connection-timed-out/'); | ||
} elseif ( $this->strExists('timeout') || $this->strExists('open socket' ) ) { | ||
$possible_solution[] = 'Your hosting is blocking the connection, contact their support'; | ||
} elseif ( $this->strExists( 'DATA NOT ACCEPTED' ) || $this->strExists('Exception:SendAsDeniedException' ) ) { | ||
$possible_solution[] = $this->make_clickable('https://postmansmtp.com/storedrv-submission-exceptionsendasdeniedexception-mapiexceptionsendasdenied/'); | ||
} elseif ( $this->strExists( 'Incorrect authentication data') ) { | ||
$possible_solution[] = $this->make_clickable( 'https://postmansmtp.com/incorrect-authentication-data/' ); | ||
} elseif ( $this->strExists( 'Unrecognized authentication type' ) ) { | ||
$possible_solution[] = 'Change "Authentication" type on plugin settings to "Login"'; | ||
} elseif ( $this->strExists( 'Error executing "SendRawEmail"' ) ) { | ||
$possible_solution[] = 'Amazon SES - account permission error (review account configuration)'; | ||
} elseif ( $this->strExists( 'Please log in via your web browser and then try again' ) ) { | ||
$possible_solution[] = $this->make_clickable( 'https://postmansmtp.com/gmail-gsuite-please-log-in-via-your-web-browser-and-then-try-again/' ); | ||
} elseif ( $this->strExists( 'Application-specific password required' ) ) { | ||
$possible_solution[] = 'Two factor authentication is enabled, replace your password with app password.'; | ||
$possible_solution[] = $this->make_clickable( 'https://support.google.com/mail/?p=InvalidSecondFactor' ); | ||
} elseif ( $this->strExists( 'Username and Password not accepted' ) || $this->strExists( 'Authentication unsuccessful' ) ) { | ||
$possible_solution[] = 'Check you credentials, wrong email or password.'; | ||
} else { | ||
$possible_solution[] = 'Not found, check status column for more info.'; | ||
} | ||
|
||
return ! empty( $possible_solution ) ? implode( '<br>', $possible_solution ) : ''; | ||
} | ||
|
||
private function make_clickable($url) { | ||
return '<a target="_blank" href="' . esc_url($url ) . '">' . esc_html( 'Read here' ) . '</a>'; | ||
} | ||
|
||
private function strExists( $value ) { | ||
return strpos( strtolower( $this->status ), strtolower( addslashes( $value ) ) ) !== false; | ||
} | ||
|
||
} | ||
|
||
new StatusSolution(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,159 @@ | ||
<?php | ||
if ( ! defined( 'ABSPATH' ) ) { | ||
exit; // Exit if accessed directly | ||
} | ||
|
||
if ( ! class_exists( 'PHPMailer', false ) ) { | ||
require_once ABSPATH . WPINC . '/PHPMailer/PHPMailer.php'; | ||
require_once ABSPATH . WPINC . '/PHPMailer/SMTP.php'; | ||
require_once ABSPATH . WPINC . '/PHPMailer/Exception.php'; | ||
} | ||
|
||
use PHPMailer\PHPMailer\PHPMailer; | ||
use PHPMailer\PHPMailer\Exception; | ||
|
||
add_action('plugins_loaded', function() { | ||
global $phpmailer; | ||
|
||
$phpmailer = new PostsmtpMailer(true); | ||
}); | ||
|
||
class PostsmtpMailer extends PHPMailer { | ||
|
||
private $mail_args = array(); | ||
|
||
private $options; | ||
|
||
private $error; | ||
|
||
private $transcript = ''; | ||
|
||
public function __construct($exceptions = null) | ||
{ | ||
parent::__construct($exceptions); | ||
|
||
$this->set_vars(); | ||
$this->hooks(); | ||
|
||
} | ||
|
||
public function set_vars() { | ||
$this->options = PostmanOptions::getInstance(); | ||
$this->Debugoutput = function($str, $level) { | ||
$this->transcript .= $str; | ||
}; | ||
} | ||
|
||
public function hooks() { | ||
add_filter( 'wp_mail', array( $this, 'get_mail_args' ) ); | ||
if ( $this->options->getTransportType() == 'smtp' ) { | ||
add_action( 'phpmailer_init', array( $this, 'phpmailer_smtp_init' ), 999 ); | ||
} | ||
} | ||
|
||
public function get_mail_args( $atts ) { | ||
$this->mail_args = array(); | ||
$this->mail_args[] = $atts['to']; | ||
$this->mail_args[] = $atts['subject']; | ||
$this->mail_args[] = $atts['message']; | ||
$this->mail_args[] = $atts['headers']; | ||
$this->mail_args[] = $atts['attachments']; | ||
|
||
return $atts; | ||
} | ||
|
||
/** | ||
* @param PHPMailer $mail | ||
*/ | ||
public function phpmailer_smtp_init($mail) { | ||
$mail->SMTPDebug = 3; | ||
$mail->isSMTP(); | ||
$mail->Host = $this->options->getHostname(); | ||
|
||
if ( $this->options->getAuthenticationType() !== 'none' ) { | ||
$mail->SMTPAuth = true; | ||
$mail->Username = $this->options->getUsername(); | ||
$mail->Password = $this->options->getPassword(); | ||
} | ||
|
||
if ( $this->options->getEncryptionType() !== 'none' ) { | ||
$mail->SMTPSecure = $this->options->getEncryptionType(); | ||
} | ||
|
||
$mail->Port = $this->options->getPort(); | ||
|
||
if ( $this->options->isPluginSenderEmailEnforced() ) { | ||
$mail->setFrom( $this->options->getMessageSenderEmail() , $this->options->getMessageSenderName () ); | ||
} | ||
} | ||
|
||
public function send() | ||
{ | ||
require_once dirname(__DIR__) . '/PostmanWpMail.php'; | ||
|
||
// create a PostmanWpMail instance | ||
$postmanWpMail = new PostmanWpMail(); | ||
$postmanWpMail->init(); | ||
|
||
list($to, $subject, $body, $headers, $attachments) = array_pad( $this->mail_args, 5, null ); | ||
|
||
// build the message | ||
$postmanMessage = $postmanWpMail->processWpMailCall( $to, $subject, $body, $headers, $attachments ); | ||
|
||
// build the email log entry | ||
$log = new PostmanEmailLog(); | ||
$log->originalTo = $to; | ||
$log->originalSubject = $subject; | ||
$log->originalMessage = $body; | ||
$log->originalHeaders = $headers; | ||
|
||
// get the transport and create the transportConfig and engine | ||
$transport = PostmanTransportRegistry::getInstance()->getActiveTransport(); | ||
|
||
add_filter( 'postman_wp_mail_result', [ $this, 'postman_wp_mail_result' ] ); | ||
|
||
try { | ||
|
||
if ( $send_email = apply_filters( 'post_smtp_do_send_email', true ) ) { | ||
$result = $this->options->getTransportType() !== 'smtp' ? | ||
$postmanWpMail->send( $to, $subject, $body, $headers, $attachments ) : | ||
$this->sendSmtp(); | ||
} | ||
|
||
|
||
do_action( 'post_smtp_on_success', $log, $postmanMessage, $this->transcript, $transport ); | ||
|
||
return $result; | ||
|
||
} catch (Exception $exc) { | ||
|
||
$this->error = $exc; | ||
|
||
$this->mailHeader = ''; | ||
|
||
$this->setError($exc->getMessage()); | ||
if ($this->exceptions) { | ||
throw $exc; | ||
} | ||
return false; | ||
} | ||
|
||
} | ||
|
||
public function sendSmtp() { | ||
if (!$this->preSend()) { | ||
return false; | ||
} | ||
return $this->postSend(); | ||
} | ||
|
||
|
||
public function postman_wp_mail_result() { | ||
$result = [ | ||
'time' => '', | ||
'exception' => $this->error, | ||
'transcript' => $this->transcript, | ||
]; | ||
return $result; | ||
} | ||
} |
Oops, something went wrong.