update
This commit is contained in:
534
wp-content/plugins/secure-downloads/core/any/api-emails.php
Normal file
534
wp-content/plugins/secure-downloads/core/any/api-emails.php
Normal file
@@ -0,0 +1,534 @@
|
||||
<?php
|
||||
/**
|
||||
* @version 1.1
|
||||
* @package General Emails API
|
||||
* @category General Emails API Fields for Settings page and Functions for Sending emails.
|
||||
* @author wpdevelop
|
||||
*
|
||||
* @web-site https://oplugins.com/
|
||||
* @email info@oplugins.com
|
||||
* @modified 2016-05-12, 2015-10-06
|
||||
*/
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
|
||||
// Email Settings API - Saving different options
|
||||
abstract class OPSD_Emails_API extends OPSD_Settings_API {
|
||||
|
||||
public $sending;
|
||||
public $replace = array();
|
||||
|
||||
|
||||
|
||||
/** Email Settings API Constructor
|
||||
* During creation, system try to load values from DB, if exist.
|
||||
*
|
||||
* @param type $id - "Pure Email Template name
|
||||
*/
|
||||
public function __construct( $id, $init_fields_values = array()) {
|
||||
|
||||
$options = array(
|
||||
'db_prefix_option' => 'opsd_email_'
|
||||
, 'db_saving_type' => 'togather' // { 'togather' (Default), 'separate', 'separate_prefix' }
|
||||
);
|
||||
// Email template saved as:
|
||||
// ( "prefix_email_" . $id ) >>> "prefix_email_new_admin"
|
||||
|
||||
parent::__construct( $id, $options, $init_fields_values ); // Define ID of Setting page and options
|
||||
|
||||
add_filter( 'phpmailer_init', array( $this, 'process_multipart' ) ); // For multipart messages
|
||||
|
||||
add_action( 'wp_mail_failed', array($this, 'email_error_parse') ); // Parse any errors during sending emails.
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** This function must be overriden - Initialise Settings Form Fields
|
||||
|
||||
public function init_settings_fields() {
|
||||
|
||||
$this->fields = array();
|
||||
|
||||
$this->fields['enabled'] = array(
|
||||
'type' => 'checkbox'
|
||||
, 'default' => 'On'
|
||||
, 'title' => __('Enable / Disable', 'secure-downloads')
|
||||
, 'label' => __('Enable this email notification', 'secure-downloads')
|
||||
, 'description' => ''
|
||||
, 'group' => 'general'
|
||||
|
||||
);
|
||||
// ...
|
||||
}
|
||||
/**/
|
||||
|
||||
|
||||
|
||||
// <editor-fold defaultstate="collapsed" desc=" Suport functions " >
|
||||
|
||||
/** List of preg* regular expression patterns to search for replace in plain emails.
|
||||
* More: https://raw.github.com/ushahidi/wp-silcc/master/class.html2text.inc
|
||||
*/
|
||||
private function get_plain_search_array() {
|
||||
return array(
|
||||
"/\r/", // Non-legal carriage return
|
||||
'/&(nbsp|#160);/i', // Non-breaking space
|
||||
'/&(quot|rdquo|ldquo|#8220|#8221|#147|#148);/i', // Double quotes
|
||||
'/&(apos|rsquo|lsquo|#8216|#8217);/i', // Single quotes
|
||||
'/>/i', // Greater-than
|
||||
'/</i', // Less-than
|
||||
'/&/i', // Ampersand
|
||||
'/&/i', // Ampersand
|
||||
'/&/i', // Ampersand
|
||||
'/&(copy|#169);/i', // Copyright
|
||||
'/&(trade|#8482|#153);/i', // Trademark
|
||||
'/&(reg|#174);/i', // Registered
|
||||
'/&(mdash|#151|#8212);/i', // mdash
|
||||
'/&(ndash|minus|#8211|#8722);/i', // ndash
|
||||
'/&(bull|#149|#8226);/i', // Bullet
|
||||
'/&(pound|#163);/i', // Pound sign
|
||||
'/&(euro|#8364);/i', // Euro sign
|
||||
'/$/', // Dollar sign
|
||||
'/&[^&;]+;/i', // Unknown/unhandled entities
|
||||
'/[ ]{2,}/' // Runs of spaces, post-handling
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/** List of symbols "for Replace To" */
|
||||
private function get_plain_replace_array() {
|
||||
|
||||
return array(
|
||||
'', // Non-legal carriage return
|
||||
' ', // Non-breaking space
|
||||
'"', // Double quotes
|
||||
"'", // Single quotes
|
||||
'>', // Greater-than
|
||||
'<', // Less-than
|
||||
'&', // Ampersand
|
||||
'&', // Ampersand
|
||||
'&', // Ampersand
|
||||
'(c)', // Copyright
|
||||
'(tm)', // Trademark
|
||||
'(R)', // Registered
|
||||
'--', // mdash
|
||||
'-', // ndash
|
||||
'*', // Bullet
|
||||
'£', // Pound sign
|
||||
'EUR', // Euro sign. € ?
|
||||
'$', // Dollar sign
|
||||
'', // Unknown/unhandled entities
|
||||
' ' // Runs of spaces, post-handling
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/** Esacpe and replace any HTML entities
|
||||
*
|
||||
* @param type $string
|
||||
* @return string
|
||||
*/
|
||||
public function esc_to_plain_text( $string ) {
|
||||
|
||||
// //Replace <a href="http://server.com">Link</a> to Link( http://server.com )
|
||||
// $pattern = "/<a(.*)+href=[\"|']+([^\"']+)(?=(\"|'))[^>]*>(.*)<\/a>/" ; //"/(?<=href=(\"|'))[^\"']+(?=(\"|'))/i";
|
||||
// $newurl = "$4 ($2)";
|
||||
// $string = preg_replace($pattern,$newurl,$string);
|
||||
|
||||
$newstring = preg_replace( $this->get_plain_search_array(), $this->get_plain_replace_array(), strip_tags( $string ) );
|
||||
return $newstring;
|
||||
}
|
||||
|
||||
|
||||
/** Set array for replacing shortcodes in Email Content and Subject
|
||||
*
|
||||
* @param array $replace - if this parameter skipped, then array reseted to empty array
|
||||
*/
|
||||
function set_replace( $replace = array() ) {
|
||||
$this->replace = $replace;
|
||||
}
|
||||
|
||||
|
||||
/** Replace shortcodes in givven string. Usually its Email Content and Subject
|
||||
*
|
||||
* @param string $subject
|
||||
*/
|
||||
public function replace_shortcodes( $subject ) {
|
||||
|
||||
$defaults = array(
|
||||
'ip' => apply_opsd_filter( 'opsd_get_user_ip' )
|
||||
, 'blogname' => wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES )
|
||||
, 'siteurl' => get_site_url()
|
||||
);
|
||||
|
||||
$replace = wp_parse_args( $this->replace, $defaults );
|
||||
|
||||
foreach ( $replace as $replace_shortcode => $replace_value ) {
|
||||
if ( is_string( $replace_value ) ) { //FixIn: 1.1.3.1
|
||||
$replace_shortcode = (string) $replace_shortcode;
|
||||
$replace_value = (string) $replace_value;
|
||||
$subject = str_replace( array( '[' . $replace_shortcode . ']'
|
||||
, '{' . $replace_shortcode . '}' )
|
||||
, $replace_value
|
||||
, $subject );
|
||||
}
|
||||
}
|
||||
|
||||
return $subject;
|
||||
}
|
||||
|
||||
// </editor-fold>
|
||||
|
||||
|
||||
// <editor-fold defaultstate="collapsed" desc=" Pure Email functions " >
|
||||
|
||||
/** For MultiPart email define plain text - AltBody
|
||||
*
|
||||
* Also additionaly fix Sender - its have to be same as From
|
||||
*
|
||||
* @param PHPMailer $mailer
|
||||
* @return PHPMailer
|
||||
*/
|
||||
public function process_multipart( $mailer ) {
|
||||
|
||||
//if ( $this->sending && $this->get_email_content_type() == 'multipart' ) {
|
||||
if ( $this->sending ) {
|
||||
|
||||
if ( $this->get_email_content_type() == 'multipart' )
|
||||
$mailer->AltBody = wordwrap( $this->esc_to_plain_text( $this->replace_shortcodes( $this->get_content_plain() ) ) );
|
||||
|
||||
$mailer->Sender = $mailer->From;
|
||||
|
||||
//$this->sending = false; // If we set it to false, then we can not trigger for any Mail errors in this CLASS
|
||||
}
|
||||
|
||||
return $mailer;
|
||||
}
|
||||
|
||||
|
||||
/** Get type of Email: 'plain' | 'html' | 'multipart'
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_email_content_type() {
|
||||
|
||||
return $this->fields_values['email_content_type'] && class_exists( 'DOMDocument' ) ? $this->fields_values['email_content_type'] : 'plain';
|
||||
}
|
||||
|
||||
|
||||
/** Get Email Content Type: 'text/plain' | 'text/html' | 'multipart/alternative'
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_content_type() {
|
||||
|
||||
switch ( $this->get_email_content_type() ) {
|
||||
case 'html' :
|
||||
return 'text/html';
|
||||
case 'multipart' :
|
||||
return 'multipart/alternative';
|
||||
default :
|
||||
return 'text/plain';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** Define Email Headers. For exmaple: "Conte type:" 'text/plain' | 'text/html' | 'multipart/alternative' or "From": Name <email@server.com>
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_headers( $additional_params = array() ) {
|
||||
|
||||
$mail_headers = '';
|
||||
|
||||
$from_address = $this->get_from__email_address();
|
||||
|
||||
if ( ! empty( $from_address ) ) {
|
||||
$mail_headers .= 'From: ' . $this->get_from__name() . ' <' . $from_address . '> ' . "\r\n" ;
|
||||
} else {
|
||||
/* 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.
|
||||
*/
|
||||
}
|
||||
|
||||
$mail_headers .= 'Content-Type: ' . $this->get_content_type() . "\r\n" ;
|
||||
|
||||
$mail_headers = apply_filters( 'opsd_email_api_get_headers_after', $mail_headers, $this->id, $this->fields_values , $this->replace, $additional_params );
|
||||
|
||||
return $mail_headers;
|
||||
}
|
||||
|
||||
|
||||
/** Get Content of Email
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_content() {
|
||||
|
||||
if ( $this->get_email_content_type() == 'plain' ) {
|
||||
$email_content = $this->esc_to_plain_text( $this->replace_shortcodes( $this->get_content_plain() ) );
|
||||
} else {
|
||||
$email_content = $this->replace_shortcodes( $this->get_content_html() );
|
||||
}
|
||||
|
||||
$email_content = apply_filters( 'opsd_email_api_get_content_after' , $email_content, $this->id, $this->get_email_content_type() );
|
||||
|
||||
// Remove all shortcodes, which is not replaced early.
|
||||
$email_content = preg_replace ('/[\[\{][a-zA-Z0-9.,_-]{0,}[\]\}]/', '', $email_content);
|
||||
|
||||
return wordwrap( $email_content, 100 );
|
||||
}
|
||||
|
||||
|
||||
/** Get Email Content as Text (from Plain Text template)
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function get_content_plain() {
|
||||
|
||||
//require_once( dirname(__FILE__) . '/emails_tpl/standard-text-tpl.php' );
|
||||
//require_once( dirname(__FILE__) . '/emails_tpl/plain-text-tpl.php' );
|
||||
if ( isset( $this->fields_values['template_file'] ) ) {
|
||||
$email_tpl_name = $this->fields_values['template_file'];
|
||||
} else {
|
||||
$email_tpl_name = 'plain';
|
||||
}
|
||||
|
||||
if ( file_exists( dirname(__FILE__) . '/emails_tpl/'. $email_tpl_name .'-text-tpl.php' ) )
|
||||
require_once( dirname(__FILE__) . '/emails_tpl/'. $email_tpl_name .'-text-tpl.php' );
|
||||
else
|
||||
require_once( dirname(__FILE__) . '/emails_tpl/plain-text-tpl.php' );
|
||||
|
||||
$fields_values = $this->fields_values;
|
||||
|
||||
$fields_values = apply_filters( 'opsd_email_api_get_content_before' , $fields_values, $this->id , 'plain' ); //Ability to parse 'content', 'header_content', 'footer_content' for different languges, etc ....
|
||||
|
||||
if ( function_exists( 'opsd_email_template_' . $email_tpl_name . '_text' ) )
|
||||
$plain_email = call_user_func_array( 'opsd_email_template_' . $email_tpl_name . '_text' , array( $fields_values ) );
|
||||
else
|
||||
$plain_email = opsd_email_template_text( $fields_values );
|
||||
|
||||
// Replace <p> | <br> to \n
|
||||
$plain_email = preg_replace( '/<(br|p)[\t\s]*[\/]?>/i', "\n", $plain_email );
|
||||
// $plain_email = str_replace( array('<br/>', '<br>'), "\n", $plain_email );
|
||||
|
||||
return $plain_email;
|
||||
}
|
||||
|
||||
|
||||
/** Get Email Content as HTML (from HTML template)
|
||||
*
|
||||
* @return type
|
||||
*/
|
||||
function get_content_html() {
|
||||
|
||||
// Load specific Email Template: ///////////////////////////////////
|
||||
if ( isset( $this->fields_values['template_file'] ) ) {
|
||||
$email_tpl_name = $this->fields_values['template_file'];
|
||||
} else {
|
||||
$email_tpl_name = 'plain';
|
||||
}
|
||||
//require_once( dirname(__FILE__) . '/emails_tpl/standard-html-tpl.php' );
|
||||
//require_once( dirname(__FILE__) . '/emails_tpl/plain-html-tpl.php' );
|
||||
|
||||
if ( file_exists( dirname(__FILE__) . '/emails_tpl/'. $email_tpl_name .'-html-tpl.php' ) )
|
||||
require_once( dirname(__FILE__) . '/emails_tpl/'. $email_tpl_name .'-html-tpl.php' );
|
||||
else
|
||||
require_once( dirname(__FILE__) . '/emails_tpl/plain-html-tpl.php' );
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
$fields_values = $this->fields_values;
|
||||
|
||||
$fields_values = apply_filters( 'opsd_email_api_get_content_before' , $fields_values, $this->id , 'html' ); //Ability to parse 'content', 'header_content', 'footer_content' for different languges, etc ....
|
||||
|
||||
if ( function_exists( 'opsd_email_template_' . $email_tpl_name . '_html' ) )
|
||||
$html_email = call_user_func_array( 'opsd_email_template_' . $email_tpl_name . '_html' , array( $fields_values ) );
|
||||
else
|
||||
$html_email = opsd_email_template_html( $fields_values );
|
||||
|
||||
return $html_email;
|
||||
}
|
||||
|
||||
|
||||
/** Get escaped Email Subject
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_subject() {
|
||||
|
||||
$subject = $this->fields_values['subject'];
|
||||
|
||||
$subject = apply_filters( 'opsd_email_api_get_subject_before' , $subject, $this->id );
|
||||
|
||||
$subject = $this->esc_to_plain_text( $this->replace_shortcodes( $subject ) );
|
||||
|
||||
$subject = apply_filters( 'opsd_email_api_get_subject_after' , $subject, $this->id );
|
||||
|
||||
return $subject;
|
||||
}
|
||||
|
||||
|
||||
/** Get escapeed Name from any not supporting characters
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_from__name() {
|
||||
return wp_specialchars_decode( esc_html( stripslashes( $this->fields_values['from_name'] ) ), ENT_QUOTES );
|
||||
}
|
||||
|
||||
|
||||
/** Get sanitized Email address
|
||||
*
|
||||
* @return type
|
||||
*/
|
||||
public function get_from__email_address() {
|
||||
return sanitize_email( $this->fields_values['from'] );
|
||||
}
|
||||
|
||||
|
||||
/** For future support, right now does not support
|
||||
*
|
||||
* @return empty string
|
||||
*/
|
||||
public function get_attachments() {
|
||||
return '';
|
||||
}
|
||||
|
||||
|
||||
/** Check email and format it
|
||||
*
|
||||
* @param string $emails
|
||||
* @return string
|
||||
*/
|
||||
public function validate_emails( $emails ) {
|
||||
|
||||
$emails = str_replace(';', ',', $emails);
|
||||
|
||||
if ( !is_array( $emails ) )
|
||||
$emails = explode( ',', $emails );
|
||||
|
||||
$emails_list = array();
|
||||
foreach ( (array) $emails as $recipient ) {
|
||||
|
||||
// Break $recipient into name and address parts if in the format "Foo <bar@baz.com>"
|
||||
$recipient_name = '';
|
||||
if( preg_match( '/(.*)<(.+)>/', $recipient, $matches ) ) {
|
||||
if ( count( $matches ) == 3 ) {
|
||||
$recipient_name = $matches[1];
|
||||
$recipient = $matches[2];
|
||||
}
|
||||
} else {
|
||||
// Check about correct format of email
|
||||
if( preg_match( '/([\w\.\-_]+)?\w+@[\w\-_]+(\.\w+){1,}/im', $recipient, $matches ) ) { //FixIn: 8.7.7.2
|
||||
$recipient = $matches[0];
|
||||
}
|
||||
}
|
||||
|
||||
//$recipient_name = str_replace('"', '', $recipient_name);
|
||||
$recipient_name = trim( wp_specialchars_decode( esc_html( stripslashes( $recipient_name ) ), ENT_QUOTES ) );
|
||||
|
||||
$emails_list[] = ( empty( $recipient_name ) ? '' : $recipient_name . ' ' )
|
||||
. '<' . sanitize_email( $recipient ) . '>';
|
||||
}
|
||||
|
||||
$emails_list = implode( ',', $emails_list );
|
||||
|
||||
return $emails_list;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make Email Sending by using wp_mail standard function.
|
||||
*
|
||||
* @param string $to - Email
|
||||
* @param array $replace - accociated array of values to replace in email Body and Subject. Exmaple: array( 'name' => 'Jo', 'secondname' => 'Smith' )
|
||||
* @return boolean Sent or Failed to send.
|
||||
*/
|
||||
public function send( $to = '', $replace = array() ) {
|
||||
|
||||
$return = false;
|
||||
|
||||
// if ( empty( $to ) )
|
||||
// return $return;
|
||||
|
||||
$this->sending = true;
|
||||
|
||||
|
||||
$this->set_replace( $replace );
|
||||
|
||||
$to = $this->validate_emails( $to );
|
||||
|
||||
$subject = $this->get_subject();
|
||||
$message = $this->get_content();
|
||||
$headers = $this->get_headers();
|
||||
$attachments = $this->get_attachments();
|
||||
//debuge('In email', htmlentities($to), $subject, htmlentities($message), $headers, $attachments) ;
|
||||
$is_send_email = true;
|
||||
|
||||
$is_send_email = apply_filters( 'opsd_email_api_is_allow_send', $is_send_email, $this->id, $this->fields_values );
|
||||
|
||||
if ( $is_send_email )
|
||||
$return = wp_mail( $to, $subject, $message, $headers, $attachments );
|
||||
|
||||
$this->sending = false;
|
||||
|
||||
// Send Copy to admin email
|
||||
if (
|
||||
( isset( $this->fields_values['copy_to_admin'] ) )
|
||||
&& ( $this->fields_values['copy_to_admin'] == 'On' )
|
||||
){
|
||||
|
||||
$this->sending = true;
|
||||
|
||||
$subject = __('Email copy to', 'secure-downloads') . ' ' . str_replace( array( '<', '>' ), '', $to) . ' - ' . $subject;
|
||||
|
||||
$headers = $this->get_headers( array( 'reply' => $to ) );
|
||||
|
||||
$to = $this->validate_emails( $this->get_from__name() . ' <' . $this->get_from__email_address() . '> ' );
|
||||
|
||||
$is_send_email = apply_filters( 'opsd_email_api_is_allow_send_copy', $is_send_email, $this->id, $this->fields_values );
|
||||
|
||||
if ( $is_send_email )
|
||||
$return_copy = wp_mail( $to, $subject, $message, $headers, $attachments );
|
||||
|
||||
$this->sending = false;
|
||||
}
|
||||
|
||||
$this->set_replace(); // Reset replace parameter
|
||||
|
||||
return $return;
|
||||
}
|
||||
// </editor-fold>
|
||||
|
||||
|
||||
/** Show possible erros during sending emails.
|
||||
*
|
||||
* @param type $wp_error_object - new WP_Error( $e->getCode(), $e->getMessage(), $mail_error_data )
|
||||
*/
|
||||
public function email_error_parse( $wp_error_object ) {
|
||||
//debuge( $wp_error_object );
|
||||
if ( $this->sending ) { // Check if this error generated for email relative to this class.
|
||||
|
||||
$error_description_array = array();
|
||||
if ( isset( $wp_error_object->errors ) )
|
||||
foreach ( $wp_error_object->errors as $key_error => $error_description ) {
|
||||
$error_description_array[] = implode(' ', $error_description );
|
||||
}
|
||||
|
||||
if ( ! empty( $error_description_array ) ) {
|
||||
$error_description = implode(' ', $error_description_array ) ;
|
||||
|
||||
do_action('opsd_email_sending_error', $wp_error_object, $error_description );
|
||||
|
||||
} else {
|
||||
do_action('opsd_email_sending_error', $wp_error_object, '' );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user