all-in-one-event-calendar/lib/notification/email.php
2017-11-09 17:36:04 +01:00

157 lines
No EOL
5.2 KiB
PHP

<?php
/**
* Concrete implementation for email notifications.
*
* @author Time.ly Network Inc.
* @since 2.0
* @instantiator new
* @package AI1EC
* @subpackage AI1EC.Notification
*/
class Ai1ec_Email_Notification extends Ai1ec_Notification {
/**
* @var string
*/
private $_subject;
/**
* @var array
*/
private $_translations = array();
private $_replyTo;
/**
* @param array: $translations
*/
public function set_translations( array $translations ) {
$this->_translations = $translations;
}
public function __construct(
Ai1ec_Registry_Object $registry,
$message,
array $recipients,
$subject,
array $replyTo = null
) {
parent::__construct( $registry );
$this->_message = $message;
$this->_recipients = $recipients;
$this->_subject = $subject;
$this->_replyTo = $replyTo;
}
public function send( $headers = null ) {
$this->_parse_text();
$is_plain_text = true;
if ( null !== $headers ) {
foreach ( $headers as $key => $value ) {
if ( 0 === strcasecmp( "content-type", $key ) &&
0 === strcasecmp( "text/html", $value ) ) {
$is_plain_text = false;
break;
}
}
}
$is_mandril_active = apply_filters ( 'ai1ec_is_mandril_active', null );
if ( $is_plain_text ) {
$nl2br_handler = array( $this, 'mandrill_nl2br' );
add_filter( 'mandrill_nl2br', $nl2br_handler );
if ( $is_mandril_active ) {
$double_line_break_handler = array( $this, 'convert_single_to_double_line_break' );
add_filter( 'wp_mail', $double_line_break_handler );
}
}
$phpmailer_init_handler = array( $this, 'phpmailer_init_mandril' );
add_action( 'phpmailer_init', $phpmailer_init_handler );
$new_mail_send_failed = array( $this, 'new_mail_send_failed' );
add_filter( 'wp_mail_failed', $new_mail_send_failed );
$new_mail_from_name = array( $this, 'new_mail_from_name' );
add_filter( 'wp_mail_from_name', $new_mail_from_name );
$result = wp_mail( $this->_recipients, $this->_subject, $this->_message, $headers );
remove_filter( 'wp_mail_failed', $new_mail_send_failed );
remove_filter( 'wp_mail_from_name', $new_mail_from_name );
remove_action( 'phpmailer_init', $phpmailer_init_handler );
if ( $is_plain_text ) {
remove_filter( 'mandrill_nl2br', $nl2br_handler );
if ( $is_mandril_active ) {
remove_filter( 'wp_mail', $double_line_break_handler );
}
}
return $result;
}
public function new_mail_from_name() {
return get_bloginfo( 'name' );
}
public function new_mail_from_email() {
if ( empty( $this->_replyTo ) ) {
return $this->_registry->get( 'model.settings' )
->get( 'fes_notification_email', get_bloginfo( 'admin_email' ) );
} else {
return $this->_replyTo[0];
}
}
/**
* Handle the wp_mail_failed hook to log the error
*/
public function new_mail_send_failed( $error = null) {
if ( null != $error && is_wp_error( $error ) ) {
error_log( 'wp_mail failed, code: %d, message: %s', $error->get_error_code(), $error->get_error_message() );
} else {
error_log( 'wp_mail failed, unknow error' );
}
}
public function phpmailer_init_mandril( $phpmailer ) {
if ( method_exists( $phpmailer, 'ClearReplyTos' ) ) {
$phpmailer->ClearReplyTos();
}
$phpmailer->addReplyTo( $this->new_mail_from_email(), $this->new_mail_from_name() );
}
/**
* Handle the wp_mail_filter when sending Plain texts emails and Mandril
* is used to send notifications.
*/
public function convert_single_to_double_line_break( $atts = null ) {
//As MC-AutoHtml is set to true, mandril will convert the text/plain to generate the text/html
//this conversion will Ignores the line break (\n) from the text message. The only way to keep
//the lines breaks is have double line breaks as instructed by mandril twiter account here:
//https://twitter.com/mandrillapp/status/397377474541010944
if ( isset( $atts['message'] ) && false === empty( $atts['message'] ) ) {
$temp = str_replace( "\n\r", "\n", $atts['message'] );
$temp = str_replace( "\r\n", "\n", $temp );
$atts['message'] = str_replace( "\n", "\n\n", $temp );
}
return $atts;
}
/**
* Handle the mandrill_nl2br hook.
* When sending text/plain nl2br should be avoided
*/
public function mandrill_nl2br( $nl2br = false, $message = null ) {
return true;
}
private function _parse_text() {
if ( null !== $this->_translations ) {
$this->_message = strtr( $this->_message, $this->_translations );
$this->_subject = strtr( $this->_subject, $this->_translations );
}
}
}