File "wrapper.php"
Full Path: /home/romayxjt/public_html/wp-content/plugins/vikbooking/admin/helpers/src/mail/wrapper.php
File size: 8.04 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/**
* @package VikBooking
* @subpackage core
* @author E4J s.r.l.
* @copyright Copyright (C) 2021 E4J s.r.l. All Rights Reserved.
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
* @link https://vikwp.com
*/
// No direct access
defined('ABSPATH') or die('No script kiddies please!');
/**
* Encapsulation of the e-mail data.
*
* - Bind from array/object:
* new VBOMailWrapper([
* 'sender' => 'mail@domain.com',
* 'recipient' => 'client@domain.com',
* 'subject' => 'E-mail subject',
* 'content' => '<p>This is the e-mail message.</p>',
* ]);
*
* - or:
* VBOMailWrapper::getInstance()->bind([...]);
*
* - Construct through setters:
* VBOMailWrapper::getInstance()
* ->setSender('mail@domain.com', 'Sender Name')
* ->addRecipient('client@domain.com')
* ->setSubject('E-mail subject')
* ->setContent('<p>This is the e-mail message.</p>');
*
* @since 1.5
*/
final class VBOMailWrapper
{
/**
* Holds the sender name and e-mail address.
*
* @var array|null
*/
private $sender;
/**
* A list of recipients e-mail addresses.
*
* @var array
*/
private $recipient = [];
/**
* The reply-to e-mail address.
*
* @var string|null
*/
private $reply;
/**
* The BCC e-mail addresses.
*
* @var array
*/
private $bcc = [];
/**
* The e-mail subject.
*
* @var string
*/
private $subject;
/**
* The e-mail content.
*
* @var string
*/
private $content;
/**
* A list of attachments.
*
* @var array
*/
private $attachments = [];
/**
* Flag used to check whether the e-mail is HTML or plain text.
*
* @var bool|null
*/
private $isHtml;
/**
* Proxy used to immediately support chaining.
*
* @param array|object $data The e-mail data to bind.
*
* @return self
*/
public static function getInstance($data = [])
{
return new static($data);
}
/**
* Class constructor.
*
* @param array|object $data The e-mail data to bind.
*/
public function __construct($data = [])
{
// create the e-mail wrapper
$this->bind($data);
}
/**
* Binds the e-mail data.
*
* @param array|object $data The e-mail data to bind.
*
* @return self This object to support chaining.
*/
public function bind($data)
{
if (!is_array($data) && !is_object($data))
{
// cannot accept the received argument
throw new InvalidArgumentException(sprintf('Mail wrapper only accepts arrays or objects, %s given', gettype($data)), 406);
}
foreach ($data as $k => $v)
{
$k = strtolower($k);
switch ($k)
{
case 'ishtml':
case 'is_html':
$method = 'setHtml';
break;
default:
$method = 'set' . ucfirst($k);
}
if (method_exists($this, $method))
{
// invoke default setter
call_user_func_array([$this, $method], [$v]);
}
}
return $this;
}
/**
* Sets the e-mail sender.
*
* @param string $address The sender e-mail address.
* @param string $name The sender name.
*
* @return self This object to support chaining.
*/
public function setSender($address, $name = null)
{
if (is_array($address))
{
if (count($address) > 1)
{
// extract name from array
$name = array_pop($address);
}
// extract address from array
$address = array_shift($address);
}
$this->sender = [
'address' => $address,
'name' => $name,
];
return $this;
}
/**
* Returns the sender e-mail address.
*
* @return string|null
*/
public function getSenderMail()
{
return $this->sender && !empty($this->sender['address']) ? $this->sender['address'] : VBOFactory::getConfig()->get('senderemail');
}
/**
* Returns the sender name.
*
* @return string|null
*/
public function getSenderName()
{
return $this->sender ? $this->sender['name'] : null;
}
/**
* Sets the e-mail recipient(s).
*
* @param string|array $address Either an array or a string.
*
* @return self This object to support chaining.
*/
public function setRecipient($address)
{
// reset recipient
$this->recipient = [];
// add recipient(s)
return $this->addRecipient($address);
}
/**
* Adds a new recipient.
*
* @param string|array $address Either an array or a string.
*
* @return self This object to support chaining.
*/
public function addRecipient($address)
{
foreach ((array) $address as $addr)
{
if ($addr)
{
$this->recipient[] = $addr;
}
}
return $this;
}
/**
* Returns the list of recipients.
*
* @return array
*/
public function getRecipient()
{
return $this->recipient;
}
/**
* Sets the reply-to e-mail address.
*
* @param string $address The reply-to e-mail address.
*
* @return self This object to support chaining.
*/
public function setReply($address)
{
$this->reply = $address;
return $this;
}
/**
* Returns the reply-to e-mail address.
*
* @return string|null
*/
public function getReply()
{
return $this->reply;
}
/**
* Sets the e-mail BCC(s).
*
* @param string|array $address Either an array or a string.
*
* @return self This object to support chaining.
*/
public function setBcc($address)
{
// reset BCC
$this->bcc = [];
// add BCC(s)
return $this->addBcc($address);
}
/**
* Adds a new BCC e-mail address.
*
* @param string|array $address Either an array or a string.
*
* @return self This object to support chaining.
*/
public function addBcc($address)
{
foreach ((array) $address as $addr)
{
if ($addr)
{
$this->bcc[] = $addr;
}
}
return $this;
}
/**
* Returns the list of BCC(s).
*
* @return array
*/
public function getBcc()
{
return $this->bcc;
}
/**
* Sets the e-mail subject.
*
* @param string $subject The e-mail subject.
*
* @return self This object to support chaining.
*/
public function setSubject($subject)
{
$this->subject = $subject;
return $this;
}
/**
* Returns the e-mail subject.
*
* @return string|null
*/
public function getSubject()
{
return $this->subject;
}
/**
* Sets the e-mail content.
*
* @param string $content The e-mail content.
*
* @return self This object to support chaining.
*/
public function setContent($content)
{
$this->content = $content;
return $this;
}
/**
* Returns the e-mail content.
*
* @return string|null
*/
public function getContent()
{
return $this->content;
}
/**
* Sets the e-mail attachments.
*
* @param array $attachments An array of files.
*
* @return self This object to support chaining.
*/
public function setAttachments($attachments = null)
{
// reset attachments
$this->attachments = [];
if (empty($attachments))
{
return $this;
}
// add attachments
return $this->addAttachment($attachments);
}
/**
* Registers a new attachment file.
*
* @param string|array $attachment Either an array or a string.
*
* @return self This object to support chaining.
*/
public function addAttachment($attachment)
{
foreach ((array) $attachment as $file)
{
if ($file && is_file($file) && !in_array($file, $this->attachments))
{
$this->attachments[] = $file;
}
}
return $this;
}
/**
* Returns the list of attachments.
*
* @return array
*/
public function getAttachments()
{
return $this->attachments;
}
/**
* Sets the document type of the e-mail.
*
* @param bool|null $is True to use text/html, false to use
* text/plain, null for auto-detection.
*
* @return self This object to support chaining.
*/
public function setHtml($is = true)
{
$this->isHtml = is_null($is) ? null : (bool) $is;
return $this;
}
/**
* Checks whether the document type is text/html or not.
*
* @return bool True for text/html, false for text/plain.
*/
public function isHtml()
{
if (is_null($this->isHtml))
{
// auto-detect whether the content supports HTML tags
return preg_match("/<\/?[a-z0-9_\-]+\s*\/?>/i", (string) $this->content);
}
return $this->isHtml;
}
}