PHP - Класс для отправки письма с вложением
Хочу предложить вам к использованию простой и удобный класс на PHP для отправки электронных писем с возможностью вложения файлов. Внизу страницы приведены примеры использования данного класса.
//
class Mail
{
private $params = array('to', 'subject', 'message', 'from');
private $settings = array();
private $contentType = 'text/plain';
private $charset = 'utf-8';
private $headers = array();
private $body = array();
private $file;
private $separator;
private $errors = array();
private $file_extensions = array('png', 'jpg', 'pdf', 'txt');
function __construct()
{
$this->separator = md5(time());
}
function __set($name, $value)
{
if(in_array($name, $this->params) == true)
{
$this->settings[$name] = $value;
}
else
{
$this->errors[] = 'Setting [' . $name . '] doesn\'t exist';
}
}
public function checkSettings()
{
$error = array();
foreach($this->params as $value)
{
if(array_key_exists($value, $this->settings) != true) $error[] = $value;
}
if(empty($error) != true) $this->errors[] = sprintf('Settings: [%s] does\'n exist', implode(', ', $error));
return true;
}
public function setFileExtensions($array = array())
{
if(is_array($array) == true) $this->file_extensions = $array;
return $this;
}
public function checkErrors()
{
if(empty($this->errors) != true)
{
foreach($this->errors as $key => $error) throw new Exception($error);
}
return true;
}
public function isHtml($isHtml = true)
{
if($isHtml == true) $this->contentType = 'text/html';
return $this;
}
private function mainHeaders()
{
$this->headers[] = 'From: ' . $this->settings['from'];
$this->headers[] = 'MIME-Version: 1.0';
$this->headers[] = sprintf('Content-Type: multipart/mixed; boundary="%s"', $this->separator);
}
private function messageHeaders()
{
$this->body[] = '--' . $this->separator;
$this->body[] = 'Content-Transfer-Encoding: 7bit' . PHP_EOL;
$this->body[] = '--' . $this->separator;
$this->body[] = 'Content-type: ' . $this->contentType . '; charset=' . $this->charset;
$this->body[] = 'Content-Transfer-Encoding: 8bit' . PHP_EOL;
$this->body[] = $this->settings['message'];
}
private function fileHeaders()
{
$this->body[] = '--' . $this->separator;
$this->body[] = sprintf('Content-Type: application/octet-stream; name="%s"', $this->file);
$this->body[] = 'Content-Transfer-Encoding: base64';
$this->body[] = 'Content-Disposition: attachment' . PHP_EOL;
$this->body[] = $this->prepareFile();
$this->body[] = '--' . $this->separator . '--';
}
public function attachFile($file)
{
if(file_exists($file) != true) $this->errors[] = 'file ' . $file . ' doesn\'t exist';
$ext = pathinfo($file, PATHINFO_EXTENSION);
if(in_array($ext, $this->file_extensions) != true) $this->errors[] = $ext . ' not available to attach.';
$this->file = $file;
return $this;
}
private function prepareFile()
{
$handle = fopen($this->file, 'r');
$content = fread($handle, filesize($this->file));
fclose($handle);
return chunk_split(base64_encode($content));
}
public function send()
{
try
{
if($this->checkSettings() && $this->checkErrors())
{
$this->mainHeaders();
$this->messageHeaders();
if($this->file) $this->fileHeaders();
if(mail($this->settings['to'], $this->settings['subject'], implode("\r\n", $this->body), implode("\r\n", $this->headers)) == true)
{
print sprintf('Message to %s succesfully send', $this->settings['to']);
}
else
{
throw new Exception('Can not send message.');
}
}
return true;
}
catch(Exception $e)
{
echo $e->getMessage();
}
}
}
//
Пример использования вышеприведенного класса
//
/*
Создаем экземпляр класса.
*/
$m = new Mail();
/*
Указываем основные настройки.
*/
$m->to = 'address@example.ru';
$m->subject = 'Тестовая тема сообщения';
$m->message = 'Тестовое содержимое сообщения';
$m->from = 'sender@example.ru';
/*
По-умолчанию письма отправляются в формате простого текста.
Строчка ниже необходима для того, чтобы отправлять в сообщениях HTML код.
*/
$m->isHtml(true);
/*
По-умолчанию мы можем прикреплять вложения следующих форматов: png, jpg, pdf, txt.
Строчка ниже необходима для того, чтобы задать ваш собственный набор разрешенных для вложения форматов файлов.
Чтобы задать ваш собственный набор разрешенных для вложения форматов файлов, передайте в метод setFileExtensions() массив разрешенных форматов в качестве аргумента.
*/
$m->setFileExtensions(array('zip'));
/*
Прикрепляем файл в виде вложения с помощью метода attachFile().
В качестве аргумента для указанного метода необходимо указать полный путь к файлу.
*/
$m->attachFile(dirname(__FILE__) . '/demo.zip');
/*
Отправляем электронное сообщение
*/
$m->send();
//
Вам требуются услуги или консультация специалиста по веб-разработке?
Свяжитесь со мной

