191 lines
5.6 KiB
PHP
191 lines
5.6 KiB
PHP
<?php
|
|
namespace MailPoet\Router;
|
|
|
|
use MailPoet\Models\Setting;
|
|
|
|
require_once(ABSPATH . 'wp-includes/pluggable.php');
|
|
|
|
if(!defined('ABSPATH')) exit;
|
|
|
|
class Mailer {
|
|
function __construct($httpRequest = true) {
|
|
$this->mailerType = array(
|
|
'AmazonSES' => 'API',
|
|
'ElasticEmail' => 'API',
|
|
'MailGun' => 'API',
|
|
'Mandrill' => 'API',
|
|
'SendGrid' => 'API',
|
|
'MailPoet' => null,
|
|
'SMTP' => null,
|
|
'WPMail' => null
|
|
);
|
|
if(!$httpRequest) {
|
|
list($this->fromName, $this->fromEmail, $this->fromNameEmail)
|
|
= $this->getSetting('sender');
|
|
$this->mailer = $this->getSetting('mailer');
|
|
}
|
|
}
|
|
|
|
function send($data) {
|
|
$subscriber = $this->transformSubscriber($data['subscriber']);
|
|
list($fromName, $fromEmail, $fromNameEmail)
|
|
= $this->getSetting('sender');
|
|
if(!$fromName && !$fromEmail) {
|
|
wp_send_json(
|
|
array(
|
|
'result' => false,
|
|
'errors' => array(__('Please configure your name and e-mail address.'))
|
|
)
|
|
);
|
|
}
|
|
$data['mailer']['class'] = 'MailPoet\\Mailer\\' .
|
|
(($this->mailerType[$data['mailer']['method']]) ?
|
|
$this->mailerType[$data['mailer']['method']] . '\\' . $data['mailer']['method'] :
|
|
$data['mailer']['method']
|
|
);
|
|
$mailer = $this->buildMailer(
|
|
$data['mailer'],
|
|
$fromName,
|
|
$fromEmail,
|
|
$fromNameEmail
|
|
);
|
|
if(!empty($newsletter['sender_address']) &&
|
|
!empty($newsletter['sender_name'])
|
|
) {
|
|
$mailer->fromName = $newsletter['sender_name'];
|
|
$mailer->fromEmail = $newsletter['sender_address'];
|
|
$mailer->fromNameEmail = sprintf(
|
|
'%s <%s>',
|
|
$mailer->fromName,
|
|
$mailer->fromEmail
|
|
);
|
|
}
|
|
if(!empty($newsletter['reply_to_address']) &&
|
|
!empty($newsletter['reply_to_name'])
|
|
) {
|
|
$mailer->replyToName = $newsletter['reply_to_name'];
|
|
$mailer->replyToEmail = $newsletter['reply_to_address'];
|
|
$mailer->replyToNameEmail = sprintf(
|
|
'%s <%s>',
|
|
$mailer->replyToName,
|
|
$mailer->replyToEmail
|
|
);
|
|
}
|
|
$result = $mailer->send($data['newsletter'], $subscriber);
|
|
wp_send_json(
|
|
array(
|
|
'result' => ($result) ? true : false
|
|
)
|
|
);
|
|
}
|
|
|
|
function buildMailer($mailer = false, $fromName = false, $fromEmail = false, $fromNameEmail = false) {
|
|
if(!$mailer) $mailer = $this->mailer;
|
|
if(!$fromName) $fromName = $this->fromName;
|
|
if(!$fromEmail) $fromEmail = $this->fromEmail;
|
|
if(!$fromNameEmail) $fromNameEmail = $this->fromNameEmail;
|
|
switch($mailer['method']) {
|
|
case 'AmazonSES':
|
|
$mailerInstance = new $mailer['class'](
|
|
$mailer['region'],
|
|
$mailer['access_key'],
|
|
$mailer['secret_key'],
|
|
$fromNameEmail
|
|
);
|
|
break;
|
|
case 'ElasticEmail':
|
|
$mailerInstance = new $mailer['class'](
|
|
$mailer['api_key'],
|
|
$fromEmail, $fromName
|
|
);
|
|
break;
|
|
case 'MailGun':
|
|
$mailerInstance = new $mailer['class'](
|
|
$mailer['domain'],
|
|
$mailer['api_key'],
|
|
$fromNameEmail
|
|
);
|
|
break;
|
|
case 'MailPoet':
|
|
$mailerInstance = new $mailer['class'](
|
|
$mailer['mailpoet_api_key'],
|
|
$fromEmail,
|
|
$fromName
|
|
);
|
|
break;
|
|
case 'Mandrill':
|
|
$mailerInstance = new $mailer['class'](
|
|
$mailer['api_key'],
|
|
$fromEmail, $fromName
|
|
);
|
|
break;
|
|
case 'SendGrid':
|
|
$mailerInstance = new $mailer['class'](
|
|
$mailer['api_key'],
|
|
$fromEmail,
|
|
$fromName
|
|
);
|
|
break;
|
|
case 'WPMail':
|
|
$mailerInstance = new $mailer['class'](
|
|
$fromEmail,
|
|
$fromName
|
|
);
|
|
break;
|
|
case 'SMTP':
|
|
$mailerInstance = new $mailer['class'](
|
|
$mailer['host'],
|
|
$mailer['port'],
|
|
$mailer['authentication'],
|
|
$mailer['login'],
|
|
$mailer['password'],
|
|
$mailer['encryption'],
|
|
$fromEmail,
|
|
$fromName
|
|
);
|
|
break;
|
|
default:
|
|
throw new \Exception('Mailing method does not exist.');
|
|
break;
|
|
}
|
|
return $mailerInstance;
|
|
}
|
|
|
|
function transformSubscriber($subscriber) {
|
|
if(!is_array($subscriber)) return $subscriber;
|
|
if(isset($subscriber['address'])) $subscriber['email'] = $subscriber['address'];
|
|
$first_name = (isset($subscriber['first_name'])) ? $subscriber['first_name'] : '';
|
|
$last_name = (isset($subscriber['last_name'])) ? $subscriber['last_name'] : '';
|
|
if(!$first_name && !$last_name) return $subscriber['email'];
|
|
$subscriber = sprintf('%s %s <%s>', $first_name, $last_name, $subscriber['email']);
|
|
$subscriber = trim(preg_replace('!\s\s+!', ' ', $subscriber));
|
|
return $subscriber;
|
|
}
|
|
|
|
function getSetting($setting) {
|
|
switch($setting) {
|
|
case 'mailer':
|
|
$mailer = Setting::getValue('mta', null);
|
|
if(!$mailer || !isset($mailer['method'])) throw new \Exception('Mailing method is not configured.');
|
|
$mailer['class'] = 'MailPoet\\Mailer\\' .
|
|
(($this->mailerType[$mailer['method']]) ?
|
|
$this->mailerType[$mailer['method']] . '\\' . $mailer['method'] :
|
|
$mailer['method']
|
|
);
|
|
return $mailer;
|
|
break;
|
|
case 'sender':
|
|
$sender = Setting::getValue($setting, null);
|
|
if(!$sender) throw new \Exception('Sender name and email are not configured.');
|
|
return array(
|
|
$sender['name'],
|
|
$sender['address'],
|
|
sprintf('%s <%s>', $sender['name'], $sender['address'])
|
|
);
|
|
break;
|
|
default:
|
|
return Setting::getValue($setting, null);
|
|
break;
|
|
}
|
|
}
|
|
} |