/home/smartonegroup/public_html/system/system/autoload/Mailer.php
<?php
/**
* Simple Mail
*
* A simple PHP wrapper class for sending email using the mail() method.
*
* PHP version > 5.2
*
* LICENSE: This source file is subject to the MIT license, which is
* available through the world-wide-web at the following URI:
* http://github.com/eoghanobrien/php-simple-mail/LICENCE.txt
*
* @category SimpleMail
* @package SimpleMail
* @author Eoghan O'Brien <eoghan@eoghanobrien.com>
* @copyright 2009 - 2017 Eoghan O'Brien
* @license http://github.com/eoghanobrien/php-simple-mail/LICENCE.txt MIT
* @version 1.7
* @link http://github.com/eoghanobrien/php-simple-mail
*/
/**
* Simple Mail class.
*
* @category SimpleMail
* @package SimpleMail
* @author Eoghan O'Brien <eoghan@eoghanobrien.com>
* @copyright 2009 - 2017 Eoghan O'Brien
* @license http://github.com/eoghanobrien/php-simple-mail/LICENCE.txt MIT
* @version 1.7
* @link http://github.com/eoghanobrien/php-simple-mail
*/
class Mailer
{
/**
* @var int $_wrap
*/
protected $_wrap = 78;
/**
* @var array $_to
*/
protected $_to = array();
/**
* @var string $_subject
*/
protected $_subject;
/**
* @var string $_message
*/
protected $_message;
/**
* @var array $_headers
*/
protected $_headers = array();
/**
* @var string $_parameters
*/
protected $_params;
/**
* @var array $_attachments
*/
protected $_attachments = array();
/**
* @var string $_uid
*/
protected $_uid;
/**
* @var string $_transport
*/
protected $_transport = 'mail';
/**
* @var string $_transport
*/
protected $_log = true;
/**
* @var int $_userId
*/
protected $_userId = 0;
/**
* Named constructor.
*
* @return static
*/
public static function make()
{
return new Mailer();
}
public static function init()
{
return new Mailer();
}
/**
* __construct
*
* Resets the class properties.
*/
public function __construct()
{
$this->reset();
}
/**
* reset
*
* Resets all properties to initial state.
*
* @return self
*/
public function reset()
{
$this->_to = array();
$this->_headers = array();
$this->_subject = null;
$this->_message = null;
$this->_wrap = 78;
$this->_params = null;
$this->_attachments = array();
$this->_uid = $this->getUniqueId();
return $this;
}
/**
* setTo
*
* @param string $email The email address to send to.
* @param string $name The name of the person to send to.
*
* @return self
*/
public function setTo($email, $name)
{
$this->_to[] = $this->formatHeader((string) $email, (string) $name);
return $this;
}
/**
* setTransport
*
* @param string $method The transport method.
*
* @return self
*/
public function setTransport($method)
{
$this->_transport = $method;
return $this;
}
/**
* getTo
*
* Return an array of formatted To addresses.
*
* @return array
*/
public function getTo()
{
return $this->_to;
}
/**
* setFrom
*
* @param string $email The email to send as from.
* @param string $name The name to send as from.
*
* @return self
*/
public function setFrom($email, $name)
{
$this->addMailHeader('From', (string) $email, (string) $name);
return $this;
}
/**
* setCc
*
* @param array $pairs An array of name => email pairs.
*
* @return self
*/
public function setCc(array $pairs)
{
return $this->addMailHeaders('Cc', $pairs);
}
/**
* setBcc
*
* @param array $pairs An array of name => email pairs.
*
* @return self
*/
public function setBcc(array $pairs)
{
return $this->addMailHeaders('Bcc', $pairs);
}
/**
* setReplyTo
*
* @param string $email
* @param string $name
*
* @return self
*/
public function setReplyTo($email, $name = null)
{
return $this->addMailHeader('Reply-To', $email, $name);
}
/**
* setHtml
*
* @return self
*/
public function setHtml()
{
return $this->addGenericHeader(
'Content-Type', 'text/html; charset="utf-8"'
);
}
/**
* setSubject
*
* @param string $subject The email subject
*
* @return self
*/
public function setSubject($subject)
{
$this->_subject = $this->encodeUtf8(
$this->filterOther((string) $subject)
);
return $this;
}
/**
* getSubject function.
*
* @return string
*/
public function getSubject()
{
return $this->_subject;
}
/**
* setMessage
*
* @param string $message The message to send.
*
* @return self
*/
public function setMessage($message)
{
$this->_message = str_replace("\n.", "\n..", (string) $message);
return $this;
}
/**
* getMessage
*
* @return string
*/
public function getMessage()
{
return $this->_message;
}
/**
* addAttachment
*
* @param string $path The file path to the attachment.
* @param string $filename The filename of the attachment when emailed.
* @param null $data
*
* @return self
*/
public function addAttachment($path, $filename = null, $data = null)
{
$filename = empty($filename) ? basename($path) : $filename;
$data = empty($data) ? $this->getAttachmentData($path) : $data;
$this->_attachments[] = array(
'path' => $path,
'file' => $filename,
'data' => chunk_split(base64_encode($data))
);
return $this;
}
/**
* getAttachmentData
*
* @param string $path The path to the attachment file.
*
* @return string
*/
public function getAttachmentData($path)
{
$filesize = filesize($path);
$handle = fopen($path, "r");
$attachment = fread($handle, $filesize);
fclose($handle);
return $attachment;
}
/**
* addMailHeader
*
* @param string $header The header to add.
* @param string $email The email to add.
* @param string $name The name to add.
*
* @return self
*/
public function addMailHeader($header, $email, $name = null)
{
$address = $this->formatHeader((string) $email, (string) $name);
$this->_headers[] = sprintf('%s: %s', (string) $header, $address);
return $this;
}
/**
* addMailHeaders
*
* @param string $header The header to add.
* @param array $pairs An array of name => email pairs.
*
* @return self
*/
public function addMailHeaders($header, array $pairs)
{
if ($pairs === []) {
throw new InvalidArgumentException(
'You must pass at least one name => email pair.'
);
}
$addresses = array();
foreach ($pairs as $name => $email) {
$name = is_numeric($name) ? null : $name;
$addresses[] = $this->formatHeader($email, $name);
}
$this->addGenericHeader($header, implode(',', $addresses));
return $this;
}
/**
* addGenericHeader
*
* @param string $header The generic header to add.
* @param mixed $value The value of the header.
*
* @return self
*/
public function addGenericHeader($header, $value)
{
$this->_headers[] = sprintf(
'%s: %s',
(string) $header,
(string) $value
);
return $this;
}
/**
* getHeaders
*
* Return the headers registered so far as an array.
*
* @return array
*/
public function getHeaders()
{
return $this->_headers;
}
/**
* setAdditionalParameters
*
* Such as "-fyouremail@yourserver.com
*
* @param string $additionalParameters The addition mail parameter.
*
* @return self
*/
public function setParameters($additionalParameters)
{
$this->_params = (string) $additionalParameters;
return $this;
}
/**
* getAdditionalParameters
*
* @return string
*/
public function getParameters()
{
return $this->_params;
}
/**
* setWrap
*
* @param int $wrap The number of characters at which the message will wrap.
*
* @return self
*/
public function setWrap($wrap = 78)
{
$wrap = (int) $wrap;
if ($wrap < 1) {
$wrap = 78;
}
$this->_wrap = $wrap;
return $this;
}
/**
* getWrap
*
* @return int
*/
public function getWrap()
{
return $this->_wrap;
}
/**
* hasAttachments
*
* Checks if the email has any registered attachments.
*
* @return bool
*/
public function hasAttachments()
{
return !empty($this->_attachments);
}
/**
* assembleAttachment
*
* @return string
*/
public function assembleAttachmentHeaders()
{
$head = array();
$head[] = "MIME-Version: 1.0";
$head[] = "Content-Type: multipart/mixed; boundary=\"{$this->_uid}\"";
return implode(PHP_EOL, $head);
}
/**
* assembleAttachmentBody
*
* @return string
*/
public function assembleAttachmentBody()
{
$body = array();
$body[] = "This is a multi-part message in MIME format.";
$body[] = "--{$this->_uid}";
$body[] = "Content-type:text/html; charset=\"utf-8\"";
$body[] = "Content-Transfer-Encoding: 7bit";
$body[] = "";
$body[] = $this->_message;
$body[] = "";
$body[] = "--{$this->_uid}";
foreach ($this->_attachments as $attachment) {
$body[] = $this->getAttachmentMimeTemplate($attachment);
}
return implode(PHP_EOL, $body) . '--';
}
/**
* getAttachmentMimeTemplate
*
* @param array $attachment An array containing 'file' and 'data' keys.
*
* @return string
*/
public function getAttachmentMimeTemplate($attachment)
{
$file = $attachment['file'];
$data = $attachment['data'];
$head = array();
$head[] = "Content-Type: application/octet-stream; name=\"{$file}\"";
$head[] = "Content-Transfer-Encoding: base64";
$head[] = "Content-Disposition: attachment; filename=\"{$file}\"";
$head[] = "";
$head[] = $data;
$head[] = "";
$head[] = "--{$this->_uid}";
return implode(PHP_EOL, $head);
}
/**
* log
*
* @param boolean
* @return self
*/
public function setLog($log)
{
$this->_log = $log;
return $this;
}
/**
* setUserId
* @param int
* @return self
*/
public function seUserId($id)
{
$this->_userId = $id;
return $this;
}
/**
* send
*
* @return boolean
* @throws \RuntimeException on no 'To: ' address to send to.
*/
public function send()
{
$to = $this->getToForSend();
$headers = $this->getHeadersForSend();
if (empty($to)) {
throw new \RuntimeException(
'Unable to send, no To address has been set.'
);
}
if ($this->hasAttachments()) {
$message = $this->assembleAttachmentBody();
$headers .= PHP_EOL . $this->assembleAttachmentHeaders();
} else {
$message = $this->getWrapMessage();
}
if($this->_log){
$date = date('Y-m-d H:i:s');
$d = ORM::for_table('sys_email_logs')->create();
$d->userid = $this->_userId;
$d->sender = '';
$d->email = $this->_to[0];
$d->subject = $this->_subject;
$d->message = $this->_message;
$d->date = $date;
$d->iid = 0;
$d->save();
$id = $d->id();
}
return mail($to, $this->_subject, $message, $headers, $this->_params);
}
/**
* debug
*
* @return string
*/
public function debug()
{
return '<pre>' . print_r($this, true) . '</pre>';
}
/**
* magic __toString function
*
* @return string
*/
public function __toString()
{
return print_r($this, true);
}
/**
* formatHeader
*
* Formats a display address for emails according to RFC2822 e.g.
* Name <address@domain.tld>
*
* @param string $email The email address.
* @param string $name The display name.
*
* @return string
*/
public function formatHeader($email, $name = null)
{
$email = $this->filterEmail((string) $email);
if (empty($name)) {
return $email;
}
$name = $this->encodeUtf8($this->filterName((string) $name));
return sprintf('"%s" <%s>', $name, $email);
}
/**
* encodeUtf8
*
* @param string $value The value to encode.
*
* @return string
*/
public function encodeUtf8($value)
{
$value = trim($value);
if (preg_match('/(\s)/', $value)) {
return $this->encodeUtf8Words($value);
}
return $this->encodeUtf8Word($value);
}
/**
* encodeUtf8Word
*
* @param string $value The word to encode.
*
* @return string
*/
public function encodeUtf8Word($value)
{
return sprintf('=?UTF-8?B?%s?=', base64_encode($value));
}
/**
* encodeUtf8Words
*
* @param string $value The words to encode.
*
* @return string
*/
public function encodeUtf8Words($value)
{
$words = explode(' ', $value);
$encoded = array();
foreach ($words as $word) {
$encoded[] = $this->encodeUtf8Word($word);
}
return implode($this->encodeUtf8Word(' '), $encoded);
}
/**
* filterEmail
*
* Removes any carriage return, line feed, tab, double quote, comma
* and angle bracket characters before sanitizing the email address.
*
* @param string $email The email to filter.
*
* @return string
*/
public function filterEmail($email)
{
$rule = array(
"\r" => '',
"\n" => '',
"\t" => '',
'"' => '',
',' => '',
'<' => '',
'>' => ''
);
$email = strtr($email, $rule);
return filter_var($email, FILTER_SANITIZE_EMAIL);
}
/**
* filterName
*
* Removes any carriage return, line feed or tab characters. Replaces
* double quotes with single quotes and angle brackets with square
* brackets, before sanitizing the string and stripping out html tags.
*
* @param string $name The name to filter.
*
* @return string
*/
public function filterName($name)
{
$rule = array(
"\r" => '',
"\n" => '',
"\t" => '',
'"' => "'",
'<' => '[',
'>' => ']',
);
$filtered = $name;
return trim(strtr($filtered, $rule));
}
/**
* filterOther
*
* Removes ASCII control characters including any carriage return, line
* feed or tab characters.
*
* @param string $data The data to filter.
*
* @return string
*/
public function filterOther($data)
{
return filter_var($data, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW);
}
/**
* getHeadersForSend
*
* @return string
*/
public function getHeadersForSend()
{
if (empty($this->_headers)) {
return '';
}
return implode(PHP_EOL, $this->_headers);
}
/**
* getToForSend
*
* @return string
*/
public function getToForSend()
{
if (empty($this->_to)) {
return '';
}
return implode(', ', $this->_to);
}
/**
* getUniqueId
*
* @return string
*/
public function getUniqueId()
{
return md5(uniqid(time()));
}
/**
* getWrapMessage
*
* @return string
*/
public function getWrapMessage()
{
return wordwrap($this->_message, $this->_wrap);
}
}