Viewing File: /home/ubuntu/vedadeals-backend-base/vendor/mailgun/mailgun-php/src/Message/MessageBuilder.php
<?php
declare(strict_types=1);
/*
* Copyright (C) 2013 Mailgun
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Mailgun\Message;
use DateTime;
use DateTimeInterface;
use DateTimeZone;
use Mailgun\Message\Exceptions\LimitExceeded;
use Mailgun\Message\Exceptions\TooManyRecipients;
/**
* This class is used for composing a properly formed
* message object. Dealing with arrays can be cumbersome,
* this class makes the process easier. See the official
* documentation (link below) for usage instructions.
*
* @see https://github.com/mailgun/mailgun-php/blob/master/src/Mailgun/Message/README.md
*/
class MessageBuilder
{
public const RECIPIENT_COUNT_LIMIT = 1000;
public const CAMPAIGN_ID_LIMIT = 3;
public const TAG_LIMIT = 3;
/**
* @var array
*/
protected $message = [];
/**
* @var array
*/
protected $variables = [];
/**
* @var array
*/
protected $counters = [
'recipients' => [
'to' => 0,
'cc' => 0,
'bcc' => 0,
],
'attributes' => [
'attachment' => 0,
'campaign_id' => 0,
'custom_option' => 0,
'tag' => 0,
],
];
/**
* @param array $params
* @param string $key
* @return mixed
*/
private function get(array $params, string $key, $default)
{
if (array_key_exists($key, $params)) {
return $params[$key];
}
return $default;
}
/**
* @param array $params {
* full_name?:
* string,
* first?:
* string,
* last?:
* string,
* }
* @return string
*/
private function getFullName(array $params): string
{
if (isset($params['full_name'])) {
return $this->get($params, 'full_name', '');
}
return trim(sprintf('%s %s', $this->get($params, 'first', ''), $this->get($params, 'last', '')));
}
/**
* @param string $address
* @param array $variables {
* full_name?: string,
* first?: string,
* last?: string,
* }
* @return string
*/
protected function parseAddress(string $address, array $variables): string
{
$fullName = $this->getFullName($variables);
if (!empty($fullName)) {
return sprintf('"%s" <%s>', $fullName, $address);
}
return $address;
}
/**
* @param string $headerName
* @param string $address
* @param array $variables {
* full_name?:
* string,
* first?:
* string,
* last?:
* string,
* }
* @return MessageBuilder
*/
protected function addRecipient(string $headerName, string $address, array $variables): self
{
$compiledAddress = $this->parseAddress($address, $variables);
if ('h:reply-to' === $headerName) {
$this->message[$headerName] = $compiledAddress;
} elseif (isset($this->message[$headerName])) {
$this->message[$headerName][] = $compiledAddress;
} else {
$this->message[$headerName] = [$compiledAddress];
}
if (array_key_exists($headerName, $this->counters['recipients'])) {
++$this->counters['recipients'][$headerName];
}
return $this;
}
/**
* @param string $address
* @param array $variables {
* id?: string,
* full_name?: string,
* first?: string,
* last?: string,
* }
*
* @return MessageBuilder
* @throws TooManyRecipients
*/
public function addToRecipient(string $address, array $variables = []): self
{
if ($this->counters['recipients']['to'] > self::RECIPIENT_COUNT_LIMIT) {
throw TooManyRecipients::create('to');
}
$this->addRecipient('to', $address, $variables);
return $this;
}
/**
* @param string $address
* @param array $variables {
* id?: string,
* full_name?: string,
* first?: string,
* last?: string,
* }
*
* @return MessageBuilder
* @throws TooManyRecipients
*/
public function addCcRecipient(string $address, array $variables = []): self
{
if ($this->counters['recipients']['cc'] > self::RECIPIENT_COUNT_LIMIT) {
throw TooManyRecipients::create('cc');
}
$this->addRecipient('cc', $address, $variables);
return $this;
}
/**
* @param string $address
* @param array $variables {
* id?: string,
* full_name?: string,
* first?: string,
* last?: string,
* }
*
* @return MessageBuilder
* @throws TooManyRecipients
*/
public function addBccRecipient(string $address, array $variables = []): self
{
if ($this->counters['recipients']['bcc'] > self::RECIPIENT_COUNT_LIMIT) {
throw TooManyRecipients::create('bcc');
}
$this->addRecipient('bcc', $address, $variables);
return $this;
}
/**
* @param string $address
* @param array $variables {
* id?: string,
* full_name?: string,
* first?: string,
* last?: string,
* }
*
* @return MessageBuilder
*/
public function setFromAddress(string $address, array $variables = []): self
{
$this->addRecipient('from', $address, $variables);
return $this;
}
/**
* @param string $address
* @param array $variables {
* id?: string,
* full_name?: string,
* first?: string,
* last?: string,
* }
*
* @return MessageBuilder
*/
public function setReplyToAddress(string $address, array $variables = []): self
{
$this->addRecipient('h:reply-to', $address, $variables);
return $this;
}
/**
* @param string $subject
* @return $this
*/
public function setSubject(string $subject): self
{
$this->message['subject'] = $subject;
return $this;
}
/**
* @param string $template Name of the Mailgun template
*/
public function setTemplate(string $template): self
{
$this->message['template'] = $template;
return $this;
}
/**
* @param string $headerName
* @return $this
*/
public function addCustomHeader(string $headerName, $headerData): self
{
if (!preg_match('/^h:/i', $headerName)) {
$headerName = 'h:'.$headerName;
}
if (!array_key_exists($headerName, $this->message)) {
$this->message[$headerName] = $headerData;
} else {
if (is_array($this->message[$headerName])) {
$this->message[$headerName][] = $headerData;
} else {
$this->message[$headerName] = [$this->message[$headerName], $headerData];
}
}
return $this;
}
/**
* @param string $textBody
* @return $this
*/
public function setTextBody(string $textBody): self
{
$this->message['text'] = $textBody;
return $this;
}
/**
* @param string $htmlBody
* @return $this
*/
public function setHtmlBody(string $htmlBody): self
{
$this->message['html'] = $htmlBody;
return $this;
}
/**
* @param string $attachmentPath
* @param string|null $attachmentName
* @return $this
*/
public function addAttachment(string $attachmentPath, string $attachmentName = null): self
{
if (!isset($this->message['attachment'])) {
$this->message['attachment'] = [];
}
$this->message['attachment'][] = [
'filePath' => $attachmentPath,
'filename' => $attachmentName,
];
return $this;
}
/**
* @param string $attachmentContent
* @param string|null $attachmentName
* @return $this
*/
public function addStringAttachment(string $attachmentContent, string $attachmentName = null): self
{
if (!isset($this->message['attachment'])) {
$this->message['attachment'] = [];
}
$this->message['attachment'][] = [
'fileContent' => $attachmentContent,
'filename' => $attachmentName,
];
return $this;
}
/**
* @param string $inlineImagePath
* @param string|null $inlineImageName
* @return $this
*/
public function addInlineImage(string $inlineImagePath, string $inlineImageName = null): self
{
if (!isset($this->message['inline'])) {
$this->message['inline'] = [];
}
$this->message['inline'][] = [
'filePath' => $inlineImagePath,
'filename' => $inlineImageName,
];
return $this;
}
/**
* @param bool $enabled
* @return $this
*/
public function setTestMode(bool $enabled): self
{
$this->message['o:testmode'] = $enabled ? 'yes' : 'no';
return $this;
}
/**
* @throws LimitExceeded
*/
public function addCampaignId(string $campaignId): self
{
if ($this->counters['attributes']['campaign_id'] >= self::CAMPAIGN_ID_LIMIT) {
throw LimitExceeded::create('campaigns', self::CAMPAIGN_ID_LIMIT);
}
if (isset($this->message['o:campaign'])) {
array_push($this->message['o:campaign'], $campaignId);
} else {
$this->message['o:campaign'] = [$campaignId];
}
++$this->counters['attributes']['campaign_id'];
return $this;
}
/**
* @throws LimitExceeded
*/
public function addTag(string $tag): self
{
if ($this->counters['attributes']['tag'] >= self::TAG_LIMIT) {
throw LimitExceeded::create('tags', self::TAG_LIMIT);
}
if (isset($this->message['o:tag'])) {
array_push($this->message['o:tag'], $tag);
} else {
$this->message['o:tag'] = [$tag];
}
++$this->counters['attributes']['tag'];
return $this;
}
/**
* @param bool $enabled
* @return $this
*/
public function setDkim(bool $enabled): self
{
$this->message['o:dkim'] = $enabled ? 'yes' : 'no';
return $this;
}
/**
* @param bool $enabled
* @return $this
*/
public function setOpenTracking(bool $enabled): self
{
$this->message['o:tracking-opens'] = $enabled ? 'yes' : 'no';
return $this;
}
/**
* @param bool $enabled
* @param bool $htmlOnly
* @return $this
*/
public function setClickTracking(bool $enabled, bool $htmlOnly = false): self
{
$value = 'no';
if ($enabled) {
$value = 'yes';
if ($htmlOnly) {
$value = 'htmlonly';
}
}
$this->message['o:tracking-clicks'] = $value;
return $this;
}
/**
* @param string $timeDate
* @param string|null $timeZone
* @return $this
* @throws \Exception
*/
public function setDeliveryTime(string $timeDate, string $timeZone = null): self
{
if (null !== $timeZone) {
$timeZoneObj = new DateTimeZone($timeZone);
} else {
$timeZoneObj = new DateTimeZone('UTC');
}
$dateTimeObj = new DateTime($timeDate, $timeZoneObj);
$formattedTimeDate = $dateTimeObj->format(DateTimeInterface::RFC2822);
$this->message['o:deliverytime'] = $formattedTimeDate;
return $this;
}
/**
* @param string $customName
* @return $this
*/
public function addCustomData(string $customName, $data): self
{
$this->message['v:'.$customName] = json_encode($data);
return $this;
}
/**
* @param string $parameterName
* @return $this
*/
public function addCustomParameter(string $parameterName, $data): self
{
if (isset($this->message[$parameterName])) {
$this->message[$parameterName][] = $data;
} else {
$this->message[$parameterName] = [$data];
}
return $this;
}
/**
* @param array $message
* @return $this
*/
public function setMessage(array $message): self
{
$this->message = $message;
return $this;
}
/**
* @return array
*/
public function getMessage(): array
{
return $this->message;
}
}
Back to Directory
File Manager