Current Path : /var/test/www/foundation/wp-content/plugins/booking/core/any/ |
Current File : /var/test/www/foundation/wp-content/plugins/booking/core/any/api-emails.php |
<?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 http://wpbookingcalendar.com/ * @email info@wpbookingcalendar.com * @modified 2016-05-12, 2015-10-06 */ if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly // Email Settings API - Saving different options abstract class WPBC_Emails_API extends WPBC_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' => 'booking_email_' , 'db_saving_type' => 'togather' // { 'togather' (Default), 'separate', 'separate_prefix' } ); // Email template saved as: // ( "booking_email_" . $id ) >>> "booking_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', 'booking') , 'label' => __('Enable this email notification', 'booking') , '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_bk_filter( 'wpbc_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 ) { $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( 'wpbc_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( 'wpbc_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( 'wpbc_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( 'wpbc_email_template_' . $email_tpl_name . '_text' ) ) $plain_email = call_user_func_array( 'wpbc_email_template_' . $email_tpl_name . '_text' , array( $fields_values ) ); else $plain_email = wpbc_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( 'wpbc_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( 'wpbc_email_template_' . $email_tpl_name . '_html' ) ) $html_email = call_user_func_array( 'wpbc_email_template_' . $email_tpl_name . '_html' , array( $fields_values ) ); else $html_email = wpbc_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( 'wpbc_email_api_get_subject_before' , $subject, $this->id ); $subject = $this->esc_to_plain_text( $this->replace_shortcodes( $subject ) ); $subject = apply_filters( 'wpbc_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 ) ) { $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( 'wpbc_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', 'booking') . ' ' . 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( 'wpbc_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('wpbc_email_sending_error', $wp_error_object, $error_description ); } else { do_action('wpbc_email_sending_error', $wp_error_object, '' ); } } } }