forked from LiveCarta/LiveCartaWP
197 lines
5.3 KiB
PHP
197 lines
5.3 KiB
PHP
<?php
|
|
/**
|
|
* PostmanSmtp2GoEngine
|
|
*
|
|
* @package Postman
|
|
*/
|
|
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
if ( ! class_exists( 'PostmanSmtp2GoEngine' ) ) {
|
|
|
|
require_once 'Services/Smtp2Go/Handler.php';
|
|
|
|
class PostmanSmtp2GoEngine implements PostmanMailEngine {
|
|
protected $logger;
|
|
protected $transcript;
|
|
protected $apiKey;
|
|
|
|
public function __construct( $apiKey ) {
|
|
assert( ! empty( $apiKey ) );
|
|
$this->apiKey = $apiKey;
|
|
|
|
$this->logger = new PostmanLogger( get_class( $this ) );
|
|
}
|
|
|
|
public function send( $message ) {
|
|
$options = PostmanOptions::getInstance();
|
|
$smtp2go = new PostmanSmtp2GoHandler( $this->apiKey );
|
|
$content = array();
|
|
$headers = array();
|
|
$customHeaders = array();
|
|
|
|
$sender = $message->getFromAddress();
|
|
$replyTo = $message->getReplyTo();
|
|
$senderEmail = ! empty( $sender->getEmail() ) ? $sender->getEmail() : $options->getMessageSenderEmail();
|
|
$senderName = ! empty( $sender->getName() ) ? $sender->getName() : $options->getMessageSenderName();
|
|
|
|
$content['sender'] = $senderName . '<' . $senderEmail . '>';
|
|
|
|
$sender->log( $this->logger, 'From' );
|
|
|
|
$duplicates = array();
|
|
|
|
foreach ( (array) $message->getToRecipients() as $recipient ) {
|
|
if ( ! in_array( $recipient->getEmail(), $duplicates ) ) {
|
|
$name = $recipient->getName();
|
|
$email = $recipient->getEmail();
|
|
$content['to'][] = $name . '<' . $email . '>';
|
|
}
|
|
|
|
$duplicates[] = $recipient->getEmail();
|
|
}
|
|
|
|
if ( null !== $message->getSubject() ) {
|
|
$content['subject'] = $message->getSubject();
|
|
}
|
|
|
|
$textPart = $message->getBodyTextPart();
|
|
$htmlPart = $message->getBodyHtmlPart();
|
|
|
|
if ( ! empty( $textPart ) ) {
|
|
$this->logger->debug( 'Adding body as text' );
|
|
$content['text_body'] = $textPart;
|
|
}
|
|
|
|
if ( ! empty( $htmlPart ) ) {
|
|
$this->logger->debug( 'Adding body as html' );
|
|
$content['html_body'] = $htmlPart;
|
|
}
|
|
|
|
foreach ( (array) $message->getHeaders() as $header ) {
|
|
$this->logger->debug(
|
|
sprintf(
|
|
'Adding user header %s=%s',
|
|
$header['name'],
|
|
$header['content']
|
|
)
|
|
);
|
|
|
|
$headers[ $header['name'] ] = $header['content'];
|
|
}
|
|
|
|
foreach ( (array) $message->getCcRecipients() as $recipient ) {
|
|
if ( ! in_array( $recipient->getEmail(), $duplicates ) ) {
|
|
$name = $recipient->getName();
|
|
$email = $recipient->getEmail();
|
|
$content['cc'][] = $name . '<' . $email . '>';
|
|
}
|
|
$duplicates[] = $recipient->getEmail();
|
|
}
|
|
|
|
foreach ( (array) $message->getCcRecipients() as $recipient ) {
|
|
if ( ! in_array( $recipient->getEmail(), $duplicates ) ) {
|
|
$name = $recipient->getName();
|
|
$email = $recipient->getEmail();
|
|
$content['bcc'][] = $name . '<' . $email . '>';
|
|
}
|
|
$duplicates[] = $recipient->getEmail();
|
|
}
|
|
|
|
if ( ! empty( $headers ) ) {
|
|
$content['headers'] = $headers;
|
|
}
|
|
|
|
if ( ! empty( $replyTo ) ) {
|
|
// Normalize to array.
|
|
if ( $replyTo instanceof PostmanEmailAddress ) {
|
|
$replyTo = [ $replyTo ];
|
|
} elseif ( ! is_array( $replyTo ) ) {
|
|
$replyTo = [];
|
|
}
|
|
|
|
foreach ( $replyTo as $reply ) {
|
|
if ( $reply instanceof PostmanEmailAddress ) {
|
|
$name = $reply->getName();
|
|
$email = $reply->getEmail();
|
|
|
|
if ( ! empty( $email ) ) {
|
|
$formatted = $name ? "$name <$email>" : $email;
|
|
|
|
$customHeaders[] = array(
|
|
'header' => 'Reply-To',
|
|
'value' => $formatted,
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Only assign if we have valid headers.
|
|
if ( ! empty( $customHeaders ) ) {
|
|
$content['custom_headers'] = $customHeaders;
|
|
}
|
|
$this->logger->debug( 'Adding attachments' );
|
|
|
|
$attachments = $this->addAttachmentsToMail( $message );
|
|
|
|
if ( ! empty( $attachments ) ) {
|
|
$content['attachments'] = $attachments;
|
|
}
|
|
|
|
try {
|
|
if ( $this->logger->isDebug() ) {
|
|
$this->logger->debug( 'Sending mail' );
|
|
}
|
|
|
|
$response = $smtp2go->send( $content );
|
|
$this->transcript = print_r( $response, true );
|
|
$this->transcript .= PostmanModuleTransport::RAW_MESSAGE_FOLLOWS;
|
|
$this->transcript .= print_r( $content, true );
|
|
$this->logger->debug( 'Transcript=' . $this->transcript );
|
|
|
|
} catch ( Exception $e ) {
|
|
$this->transcript = $e->getMessage();
|
|
$this->transcript .= PostmanModuleTransport::RAW_MESSAGE_FOLLOWS;
|
|
$this->transcript .= print_r( $content, true );
|
|
$this->logger->debug( 'Transcript=' . $this->transcript );
|
|
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
public function addAttachmentsToMail( $message ) {
|
|
$attachments = $message->getAttachments();
|
|
if ( ! is_array( $attachments ) ) {
|
|
$attArray = explode( PHP_EOL, $attachments );
|
|
} else {
|
|
$attArray = $attachments;
|
|
}
|
|
|
|
$attachments = array();
|
|
|
|
foreach ( $attArray as $file ) {
|
|
if ( ! empty( $file ) ) {
|
|
$this->logger->debug( 'Adding attachment: ' . $file );
|
|
|
|
$file_name = basename( $file );
|
|
$file_parts = explode( '.', $file_name );
|
|
$file_type = wp_check_filetype( $file );
|
|
|
|
$attachments[] = array(
|
|
'filename' => $file_name,
|
|
'mimetype' => $file_type['type'],
|
|
'fileblob' => base64_encode( file_get_contents( $file ) ),
|
|
);
|
|
}
|
|
}
|
|
|
|
return $attachments;
|
|
}
|
|
|
|
public function getTranscript() {
|
|
return $this->transcript;
|
|
}
|
|
}
|
|
}
|