| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- <?php
- namespace MailPoet\Mailer\Methods;
- if (!defined('ABSPATH')) exit;
- use MailPoet\Mailer\Mailer;
- use MailPoet\Mailer\Methods\Common\BlacklistCheck;
- use MailPoet\Mailer\Methods\ErrorMappers\SMTPMapper;
- use MailPoet\WP\Functions as WPFunctions;
- use MailPoetVendor\Swift_Mailer;
- use MailPoetVendor\Swift_Message;
- use MailPoetVendor\Swift_Plugins_LoggerPlugin;
- use MailPoetVendor\Swift_Plugins_Loggers_ArrayLogger;
- use MailPoetVendor\Swift_SmtpTransport;
- class SMTP {
- public $host;
- public $port;
- public $authentication;
- public $login;
- public $password;
- public $encryption;
- public $sender;
- public $replyTo;
- public $returnPath;
- public $mailer;
- private $mailerLogger;
- const SMTP_CONNECTION_TIMEOUT = 15; // seconds
- /** @var SMTPMapper */
- private $errorMapper;
- /** @var BlacklistCheck */
- private $blacklist;
- private $wp;
- public function __construct(
- $host,
- $port,
- $authentication,
- $encryption,
- $sender,
- $replyTo,
- $returnPath,
- SMTPMapper $errorMapper,
- $login = null,
- $password = null
- ) {
- $this->wp = new WPFunctions;
- $this->host = $host;
- $this->port = $port;
- $this->authentication = $authentication;
- $this->login = $login;
- $this->password = $password;
- $this->encryption = $encryption;
- $this->sender = $sender;
- $this->replyTo = $replyTo;
- $this->returnPath = ($returnPath) ?
- $returnPath :
- $this->sender['from_email'];
- $this->mailer = $this->buildMailer();
- $this->mailerLogger = new Swift_Plugins_Loggers_ArrayLogger();
- $this->mailer->registerPlugin(new Swift_Plugins_LoggerPlugin($this->mailerLogger));
- $this->errorMapper = $errorMapper;
- $this->blacklist = new BlacklistCheck();
- }
- public function send($newsletter, $subscriber, $extraParams = []) {
- if ($this->blacklist->isBlacklisted($subscriber)) {
- $error = $this->errorMapper->getBlacklistError($subscriber);
- return Mailer::formatMailerErrorResult($error);
- }
- try {
- $message = $this->createMessage($newsletter, $subscriber, $extraParams);
- $result = $this->mailer->send($message);
- } catch (\Exception $e) {
- return Mailer::formatMailerErrorResult(
- $this->errorMapper->getErrorFromException($e, $subscriber)
- );
- }
- if ($result === 1) {
- return Mailer::formatMailerSendSuccessResult();
- } else {
- $error = $this->errorMapper->getErrorFromLog($this->mailerLogger->dump(), $subscriber);
- return Mailer::formatMailerErrorResult($error);
- }
- }
- public function buildMailer() {
- $transport = new Swift_SmtpTransport($this->host, $this->port, $this->encryption);
- $connectionTimeout = $this->wp->applyFilters('mailpoet_mailer_smtp_connection_timeout', self::SMTP_CONNECTION_TIMEOUT);
- $transport->setTimeout($connectionTimeout);
- if ($this->authentication) {
- $transport
- ->setUsername($this->login)
- ->setPassword($this->password);
- }
- $transport = $this->wp->applyFilters('mailpoet_mailer_smtp_transport_agent', $transport);
- return new Swift_Mailer($transport);
- }
- public function createMessage($newsletter, $subscriber, $extraParams = []) {
- $message = (new Swift_Message())
- ->setTo($this->processSubscriber($subscriber))
- ->setFrom(
- [
- $this->sender['from_email'] => $this->sender['from_name'],
- ]
- )
- ->setSender($this->sender['from_email'])
- ->setReplyTo(
- [
- $this->replyTo['reply_to_email'] => $this->replyTo['reply_to_name'],
- ]
- )
- ->setReturnPath($this->returnPath)
- ->setSubject($newsletter['subject']);
- if (!empty($extraParams['unsubscribe_url'])) {
- $headers = $message->getHeaders();
- $headers->addTextHeader('List-Unsubscribe', '<' . $extraParams['unsubscribe_url'] . '>');
- }
- if (!empty($newsletter['body']['html'])) {
- $message = $message->setBody($newsletter['body']['html'], 'text/html');
- }
- if (!empty($newsletter['body']['text'])) {
- $message = $message->addPart($newsletter['body']['text'], 'text/plain');
- }
- return $message;
- }
- public function processSubscriber($subscriber) {
- preg_match('!(?P<name>.*?)\s<(?P<email>.*?)>!', $subscriber, $subscriberData);
- if (!isset($subscriberData['email'])) {
- $subscriberData = [
- 'email' => $subscriber,
- ];
- }
- return [
- $subscriberData['email'] =>
- (isset($subscriberData['name'])) ? $subscriberData['name'] : '',
- ];
- }
- }
|