Загрузка ...

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();
//

Вам требуются услуги или консультация специалиста по веб-разработке?

Свяжитесь со мной
Цвет элементов сайта