Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Tree: e1626bb205
Fetching contributors…

Cannot retrieve contributors at this time

385 lines (346 sloc) 11.564 kB
<?php
/**
* Email send class
*
* @package Propeller
*/
class Email
{
/**
* тема сообщения
* @var string
*/
private $Subject = '';
/**
* Заголовки в виде ассоциативного массива
* @var array
*/
private $Headers = array();
/**
* Массив с названиями заголовков в нижнем регистре (для проверки)
* @var array
*/
private $HeaderKeys = array();
/**
* Адресат в виде ассоциативного массива
* @var array
*/
private $Recipient = array();
/**
* Путь к директории шаблонов писем
* @var string
*/
private $_tplPath = 'emails/';
/**
* Расширение файлов с шаблонами
* @var string
*/
private $_tplExt = 'tpl';
/**
* Заголовки, которые нельзя задать через ->setHeader()
* @var array
*/
private $_forbiddenHeaders = array( 'to', 'content-type');
/**
* Заданные по умолчанию заголовки в виде ассоциативного массива
* @var array
*/
private $_predefinedHeaders = array( );
/**
* Ключи заголовков по умолчанию
* @var array
*/
private $_predefinedHeadersKeys = array( );
/**
* Заголовок content-type, подставляется автоматически
* Может быть изменен через setContentType
* @var string
*/
private $ContentType = 'text/html; charset=utf-8';
/**
* Шаблон письма
* @var Template
*/
public $Template = null;
/**
* Конструктор
* @param string $tplName название шаблона (без пути!)
* @return false|void
*/
public function __construct($tplName = '')
{
try
{
if ($tplName) $this->setTemplate($tplName);
$this->_predefinedHeaders['X-Mailer'] = Config::get('app/name') . ' mailer 1.0';
$this->_predefinedHeadersKeys = array('from','x-mailer');
}
catch (Exception $e)
{
die($e->getMessage());
}
}
/**
* Задание шаблона
* @param string $tplName
*/
public function setTemplate($tplName) {
$filename = $this->_tplPath . $tplName . '.' . $this->_tplExt;
if (!is_readable(PATH_TEMPLATES.$filename))
{
$this->Template = null;
throw new Exception('Cannot load template file: "'.$filename.'"');
}
$this->Template = new Template($filename);
}
/**
* Задание темы письма
* @param string $str
*/
public function setSubject($str)
{
$this->Subject = $str;
}
/**
* Добавление заголовка
* @param string $name название заголовка (до :)
* @param string $content содержимое заголовка
* @param boolean $check проверять ли наличие; если да, то существующий заголовок не будет обновлен
*/
public function addHeader($name, $content, $check = true)
{
try
{
$lowername = strtolower($name);
if (
/**
* проверка включена и этот заголовок уже задан
*/
($check && in_array($lowername, $this->HeaderKeys))
||
/**
* заголовок запрещен к изменению
*/
in_array($lowername, $this->_forbiddenHeaders)
)
{
throw new Exception('Cannot set this header');
}
/**
* если все ок, присваиваем
*/
$this->Headers[$name] = $content;
if (!in_array($lowername, $this->HeaderKeys))
$this->HeaderKeys[] = $lowername;
}
catch (Exception $e)
{
debug($e->getFile().' ('.$e->getLine().'): '.$e->getMessage(),'Ошибка');
return false;
}
return true;
}
/**
* Задание получателя по $userLogin
* @param integer $userLogin login пользователя
* @param boolean $override если true, то изменяет существующего, если false, то посылает нах
*/
public function setRecipientByLogin($userLogin, $override = false)
{
try
{
/**
* если получатель уже задан и не стоит флаг override, отказываем
*/
if ($this->Recipient && !$override)
throw new Exception('Cannot rewrite recipient');
/**
* Достаем пользователя из базы
*/
$users = new Users();
$user = $users->getOne(array('login' => $userLogin), array('id', 'email', 'login', 'name', 'surname'));
if (!$user) {
throw new Exception('Cannot get user with login "'.$userLogin.'"');
} else {
$users->makeFullname($user);
}
$this->Recipient = $user;
}
catch (Exception $e)
{
err($e, true, 'Ошибка Задания получателя по $userLogin');
return false;
}
return true;
}
/**
* Задание получателя
* @param array $recipient получатель
* @param boolean $override если true, то изменяет существующего, если false, то посылает нах
*/
public function setRecipient($recipient, $override = false)
{
debug($recipient, '$recipient');
try {
/**
* если получатель уже задан и не стоит флаг override, отказываем
*/
if ($this->Recipient && !$override)
throw new Exception('Cannot rewrite recipient');
$this->Recipient = $recipient;
} catch (Exception $e) {
err($e, true ,'Ошибка Задания получателя ');
}
}
/**
* Задание получателя по $userId
* @param integer $userId id пользователя
* @param boolean $override если true, то изменяет существующего, если false, то посылает нах
*/
public function setRecipientById($userId, $override = false)
{
try
{
/**
* если получатель уже задан и не стоит флаг override, отказываем
*/
if ($this->Recipient && !$override)
throw new Exception('Cannot rewrite recipient');
/**
* Достаем пользователя из базы
*/
$users = new Users();
$user = $users->getOne(array('id' => intval($userId)), array('id', 'email', 'login', 'name', 'surname'));
if (!$user) {
throw new Exception('Cannot get user with id "'.$userId.'"');
} else {
$users->makeFullname($user);
}
$this->Recipient = $user;
}
catch (Exception $e)
{
err($e, true, 'Ошибка Задания получателя по $userId');
return false;
}
return true;
}
/**
* Задание content-type
* @param string $str
*/
public function setContentType($str)
{
$this->ContentType = $str;
}
/**
* Задание получателя по адресу email
* @param string $email email пользователя
* @param boolean $override если true, то изменяет существующего, если false, то посылает нах
*/
public function setRecipientByEmail($email, $override = false)
{
try
{
/**
* если получатель уже задан и не стоит флаг override, отказываем
*/
if ($this->Recipient && !$override)
throw new Exception('Cannot rewrite recipient');
/**
* Достаем пользователя из базы
*/
$users = new Users();
$user = $users->getOne(array('email' => $email), array('id','email','login', 'name', 'surname'));
if (!$user) {
throw new Exception('Cannot get user with email "'.$email.'"');
} else {
$users->makeFullname($user);
}
$this->Recipient = $user;
}
catch (Exception $e)
{
err($e, true, 'Ошибка Задания получателя по адресу email');
return false;
}
return true;
}
/**
* Отправление письма
*/
public function send($data = null, $extra = null) {
try
{
$doEncode = Config::get('components/email/encode');
/**
* если не задан получатель, отправляем нах
*/
if (!$this->Recipient)
throw new Exception('Recipient is not set');
/**
* если не задана тема, посылаем нах
*/
if (!$this->Subject)
throw new Exception('Subject is not set');
/**
* добавляем заголовок content-type
*/
$sHeaders = '';
if ($doEncode) {
$recipient = !empty($this->Recipient['fullname']) ? "=?UTF-8?B?" . base64_encode($this->Recipient['fullname']) . "?=" . ' <' . $this->Recipient['email'] . '>' : (!empty($this->Recipient['login']) ? $this->Recipient['login'] . ' <' . $this->Recipient['email'] . '>' : $this->Recipient['email']);
} else {
$recipient = !empty($this->Recipient['fullname']) ? $this->Recipient['fullname'] . ' <' . $this->Recipient['email'] . '>' : (!empty($this->Recipient['login']) ? $this->Recipient['login'] . ' <' . $this->Recipient['email'] . '>' : $this->Recipient['email']);
}
$this->Headers = array_merge($this->_predefinedHeaders, $this->Headers);
$senderEmail = empty($extra['notARobot']) ? Config::get('app/emailRobot') : Config::get('app/email');
$this->Headers['From'] = Config::get('app/name') . ' mailer <' . $senderEmail . '>';
/**
* добавляем дополнительно заданные заголовки
*/
if (count($this->Headers)){
foreach ($this->Headers as $cName => $cHeader) {
$sHeaders .= $cName . ': ' . $cHeader . "\n";
}
}
if(!$data && $this->Template) {
$data = $this->Template->parse();
}
$boundary = uniqid('--ALT--') . Box::randomString(6);
$sHeaders .= "MIME-Version: 1.0\n";
//if ($doEncode) $sHeaders .= "Content-Transfer-Encoding: base64\n";
$sHeaders .= "Content-Type: multipart/alternative;" . "\n\t" . "boundary=\"" . $boundary . "\"\n\n";
$dataPlain = "\n--" . $boundary . "\n";
$dataPlain .= "Content-type: text/plain; charset=utf-8\n";
if ($doEncode) $dataPlain .= "Content-Transfer-Encoding: base64\n\n";
$dataPlain .= doEncode ? Box::base64trim(base64_encode(strip_tags(trim($data)))) : strip_tags(trim($data));
$dataHTML = "\n\n--" . $boundary . "\n";
$dataHTML .= "Content-type: text/html; charset=utf-8\n";
if ($doEncode) $dataHTML .= "Content-Transfer-Encoding: base64\n\n";
$dataHTML .= $doEncode ? Box::base64trim(base64_encode(trim($data))) : trim($data);
$dataHTML .= "\n\n--" . $boundary . "--";
$mailBody = $dataPlain . $dataHTML;
if ($doEncode) {
$mailSubject = "=?UTF-8?B?" . base64_encode($this->Subject) . "?=";
} else {
$mailSubject = $this->Subject;
}
/**
* отправка или через очередь или напрямую
*/
if(!Config::get('components/mQueue/enabled')) {
if (!mail($recipient, $this->Subject, $mailSubject, $sHeaders)) {
throw new Exception('Cannot send mail');
}
} else {
$mq = Box::getInstanceOf('EmailQueue');
$mq->addMessage($recipient, $mailSubject, $mailBody, $sHeaders . "\n");
}
}
catch (Exception $e)
{
err($e, true, 'Ошибка отправления почты');
}
}
}
?>
Jump to Line
Something went wrong with that request. Please try again.