| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866 | <?php/** * * Cube Framework $Id$ ogzubZwehP/Dbar/vhFenwBJAAkAUl0ok54nV45kx1k= * * @link        http://codecu.be/framework * @copyright   Copyright (c) 2016 CodeCube SRL * @license     http://codecu.be/framework/license Commercial License * * @version     1.8 */namespace Cube;use Cube\Mail\Transport\AbstractTransport,    Cube\Controller\Front,    Cube\Translate\Adapter\AbstractAdapter as TranslateAdapter;/** * unified mailer class * * Class Mail * * @package Cube */class Mail{    /**     *  carriage return     */    const CRLF = "\r\n";    /**     * new line character     */    const NL = "\n";    /**     *     * mail charset     *     * @var string     */    protected $_charset = 'utf-8';    /**     *     * content type, accepted: text/plain, text/html     *     * @var string     */    protected $_contentType = 'text/plain';    /**     *     * content encoding     *     * @var string     */    protected $_encoding = '7bit';    /**     *     * mailer to use     *     * @var \Cube\Mail\Transport\AbstractTransport     */    protected $_transport;    /**     *     * to field ('address', 'name')     *     * @var array     */    protected $_to = array();    /**     *     * from field ('address', 'name')     *     * @var array     */    protected $_from = array();    /**     *     * reply to field ('address', 'name')     *     * @var array     */    protected $_replyTo = array();    /**     *     * cc field ('address', 'name')     *     * @var array     */    protected $_cc = array();    /**     *     * bcc field ('address', 'name')     *     * @var array     */    protected $_bcc = array();    /**     *     * email subject     *     * @var string     */    protected $_subject;    /**     *     * text email body     *     * @var string     */    protected $_bodyText;    /**     *     * html email body     *     * @var string     */    protected $_bodyHtml;    /**     *     * email headers     *     * @var array     */    protected $_headers = array('X-Mailer' => 'Cube Framework');    /**     * date header     *     * @var string     */    protected $_date = null;    /**     * Message-ID header     *     * @var string     */    protected $_messageId = null;    /**     *     * view object     *     * @var \Cube\View     */    protected $_view;    /**     *     * translate adapter     *     * @var \Cube\Translate\Adapter\AbstractAdapter     */    protected $_translate;    /**     *     * class constructor     *     * @param string $charset     */    public function __construct($charset = null)    {        if ($charset !== null) {            $this->_charset = $charset;        }        date_default_timezone_set(            @date_default_timezone_get());        $this->setDate()            ->setMessageId();    }    /**     *     * set charset     *     * @return string     */    public function getCharset()    {        return $this->_charset;    }    /**     *     * get charset     *     * @param string $charset     *     * @return $this     */    public function setCharset($charset)    {        $this->_charset = $charset;        return $this;    }    /**     *     * get content type     *     * @return string     */    public function getContentType()    {        return $this->_contentType;    }    /**     *     * set content type     *     * @param string $contentType     *     * @return $this     */    public function setContentType($contentType)    {        $this->_contentType = $contentType;        return $this;    }    /**     *     * get 'To' field     *     * @return array     */    public function getTo()    {        return $this->_to;    }    /**     *     * set 'To' field (clear first)     *     * @param string $address 'To' email address     * @param string $name    'To' name (optional)     *     * @return $this     */    public function setTo($address, $name = null)    {        $this->clearTo()            ->addTo($address, $name);        return $this;    }    /**     *     * add new address in the  'To' field     *     * @param string $address 'To' email address     * @param string $name    'To' name (optional)     *     * @return $this     */    public function addTo($address, $name = null)    {        $this->_to[] = array(            'address' => $address,            'name'    => $name,        );        return $this;    }    /**     *     * get 'From' field     *     * @return array     */    public function getFrom()    {        return $this->_from;    }    /**     *     * set 'From' field     *     * @param string $address 'To' email address     * @param string $name    'To' name (optional)     *     * @return $this     */    public function setFrom($address, $name = null)    {        $this->_from = array(            'address' => $address,            'name'    => $name,        );        return $this;    }    /**     *     * get 'Cc' field     *     * @return array     */    public function getCc()    {        return $this->_cc;    }    /**     *     * set 'Cc' field     *     * @param string $address 'To' email address     * @param string $name    'To' name (optional)     *     * @return $this     */    public function setCc($address, $name = null)    {        $this->_cc[] = array(            'address' => $address,            'name'    => $name,        );        return $this;    }    /**     *     * get 'Bcc' field     *     * @return array     */    public function getBcc()    {        return $this->_bcc;    }    /**     *     * set 'Bcc' field     *     * @param string $address 'To' email address     * @param string $name    'To' name (optional)     *     * @return $this     */    public function setBcc($address, $name = null)    {        $this->_bcc[] = array(            'address' => $address,            'name'    => $name,        );        return $this;    }    /**     *     * get 'ReplyTo' field     *     * @return array     */    public function getReplyTo()    {        return $this->_replyTo;    }    /**     *     * set 'ReplyTo' field     *     * @param string $address 'To' email address     * @param string $name    'To' name (optional)     *     * @return $this     */    public function setReplyTo($address, $name = null)    {        $this->_replyTo = array(            'address' => $address,            'name'    => $name,        );        return $this;    }    /**     *     * clear all "To" and headers fields     *     * @return $this     */    public function clearTo()    {        $this->_to = array();        $this->_cc = array();        $this->_bcc = array();        $this->_replyTo = array();        $this->_headers = array('X-Mailer' => 'Cube Framework');        return $this;    }    /**     *     * get subject field     *     * @return string     */    public function getSubject()    {        $translate = $this->getTranslate();        if (null !== $translate) {            $subject = $translate->_($this->_subject);        }        else {            $subject = $this->_subject;        }        return $this->_filterString($subject);    }    /**     *     * set message subject field     *     * @param string $subject     *     * @return $this     */    public function setSubject($subject)    {        $this->_subject = (string)$subject;        return $this;    }    /**     *     * get body text (for plain messages)     *     * @return string     */    public function getBodyText()    {        return $this->_bodyText;    }    /**     *     * set body text (for plain messages)     *     * @param string $bodyText     *     * @return $this     */    public function setBodyText($bodyText)    {        $this->setContentType('text/plain');        $this->_bodyText = (string)$bodyText;        return $this;    }    /**     *     * get body content (for html messages)     *     * @return string     */    public function getBodyHtml()    {        return $this->_bodyHtml;    }    /**     *     * set body content (for html messages)     *     * @param string $bodyHtml     *     * @return $this     */    public function setBodyHtml($bodyHtml)    {        $this->setContentType('text/html');        $this->_bodyHtml = (string)$bodyHtml;        return $this;    }    /**     *     * get mail body     *     * @return string     * @throws \RuntimeException     */    public function getBody()    {        if ($this->_contentType == 'text/plain') {            return $this->_bodyText;        }        else if ($this->_contentType == 'text/html') {            return $this->_bodyHtml;        }        else {            throw new \RuntimeException(sprintf("The content type must be of type                 'text/plain' or 'text/html', '%s' given", $this->_contentType));        }    }    /**     *     * add multiple headers to the message     *     * @param array $headers     *     * @return $this     */    public function addHeaders(array $headers)    {        foreach ($headers as $key => $value) {            $this->addHeader($key, $value);        }        return $this;    }    /**     *     * add a single header to the message     *     * @param string $key     * @param string $value     *     * @return $this     */    public function addHeader($key, $value)    {        $this->_headers[(string)$key] = (string)$value;        return $this;    }    /**     *     * get message date     *     * @return string     */    public function getDate()    {        return $this->_date;    }    /**     *     * set message date     *     * @param string $date     *     * @return $this     */    public function setDate($date = null)    {        if ($date === null) {            $date = date('D, j M Y H:i:s O');        }        $this->_date = $date;        return $this;    }    /**     *     * get message id     *     * @return string     */    public function getMessageId()    {        return $this->_messageId;    }    /**     *     * set message id     *     * @param string $messageId     *     * @return $this     */    public function setMessageId($messageId = null)    {        if ($messageId === null) {            $uniqId = md5(uniqid(time()));            $serverName = array_key_exists('SERVER_NAME', $_SERVER) ? $_SERVER['SERVER_NAME'] : 'localhost';            $messageId = sprintf("<%s@%s>", $uniqId, $serverName);        }        $this->_messageId = $messageId;        return $this;    }    /**     *     * get active mailer     *     * @return \Cube\Mail\Transport\AbstractTransport     */    public function getTransport()    {        if (!$this->_transport instanceof AbstractTransport) {            $this->setTransport('mail');        }        return $this->_transport;    }    /**     *     * set active mailer     *     * @param string|\Cube\Mail\Transport\AbstractTransport $transport     *     * @throws \InvalidArgumentException     * @return $this     */    public function setTransport($transport)    {        if ($transport instanceof AbstractTransport) {            $this->_transport = $transport;        }        else {            if (!class_exists($transport)) {                if (!in_array($transport, array('mail', 'sendmail', 'smtp'))) {                    throw new \InvalidArgumentException(                        sprintf("The mail transport must be                                one of 'mail', 'sendmail', 'smtp' or a class that extends                                \Cube\Mail\Transport\AbstractTransport.", $transport));                }                $transport = '\\Cube\\Mail\\Transport\\' . ucfirst($transport);            }            $this->_transport = new $transport();        }        return $this;    }    /**     *     * get the view object     *     * @return \Cube\View     */    public function getView()    {        if ($this->_view === null) {            $this->setView();        }        return $this->_view;    }    /**     * set the view object     *     * @param \Cube\View $view     *     * @return $this     */    public function setView(View $view = null)    {        if (!$view instanceof View) {            $view = new View();        }        $this->_view = $view;        return $this;    }    /**     *     * set translate adapter     *     * @param \Cube\Translate\Adapter\AbstractAdapter $translate     *     * @return $this     */    public function setTranslate(TranslateAdapter $translate)    {        $this->_translate = $translate;        return $this;    }    /**     *     * get translate adapter     *     * @return \Cube\Translate\Adapter\AbstractAdapter     */    public function getTranslate()    {        if (!$this->_translate instanceof TranslateAdapter) {            $translate = Front::getInstance()->getBootstrap()->getResource('translate');            if ($translate instanceof Translate) {                $this->setTranslate(                    $translate->getAdapter());            }        }        return $this->_translate;    }    /**     *     * format an address field     *     * @param array $data array of data     *     * @return string       formatted address     */    protected function _formatAddress($data)    {        $address = array();        if (array_key_exists('address', $data)) {            $data = array($data);        }        foreach ((array)$data as $field) {            if (isset($field['name'])) {                $address[] = $field['name'] . ' <' . $field['address'] . '>';            }            else {                $address[] = $field['address'];            }        }        return implode('; ', $address);    }    /**     *     * filter a string of new line characters and for ascii tags     *     * @param string $string     *     * @return string     */    protected function _filterString($string)    {        return str_ireplace(            array("\r", "\n", '&', ''', '"', '<', '>', ' '),            array('', '', '&', "'", '"', '<', '>', ' '), $string);    }    /**     *     * create mail header     *     * @return string     * @throws \RuntimeException     */    public function createHeader()    {        $headers = array();        $this->addHeader('Date', $this->getDate());        if (!isset($this->_from['address'])) {            throw new \RuntimeException("The 'From' email field must be set.");        }        $this->addHeader('Return-Path', '<' . $this->_from['address'] . '>');        if (!$this->_transport instanceof Mail\Transport\Mail) {            if (count($this->getTo()) > 0) {                $this->addHeader('To', $this->_formatAddress($this->_to));            }            else if (count($this->_cc) == 0) {                $this->addHeader('To', "Undisclosed Recipients");            }        }        $from[] = $this->_from;        $this->addHeader('From', $this->_formatAddress($from));        if (count($this->_cc) > 0) {            $this->addHeader('Cc', $this->_formatAddress($this->_cc));        }        if (count($this->_bcc) > 0) {            $this->addHeader('Bcc', $this->_formatAddress($this->_bcc));        }        if (count($this->_replyTo) > 0) {            $this->addHeader('Reply-To', $this->_formatAddress($this->_replyTo));        }        if (!$this->_transport instanceof Mail\Transport\Mail) {            $this->addHeader('Subject', $this->getSubject());        }        $this->addHeader('Message-ID', $this->getMessageId())            ->addHeader('MIME-Version', '1.0');        $this->addHeader('Content-Transfer-Encoding', $this->_encoding)            ->addHeader('Content-Type', sprintf('%s; charset="%s"', $this->_contentType, $this->_charset));        foreach ((array)$this->_headers as $key => $value) {            $headers[] = $key . ': ' . $value;        }        return implode(self::NL, $headers);    }    /**     *     * send mail     *     * @return bool     */    public function send()    {        return $this->getTransport()            ->setMail($this)            ->send();    }}
 |