С такой задачей сталкивалось огромнейшее количество разработчиков и, как следствие, существует огромнейшее количество готовых решений. Большинство из них содержит различного рода ошибки, реализовывает не всю функциональность или сложны в применении. Но самый весомый минус – подавляющая масса разработчиков после написания класса, отвечающего его личным потребностям сегодняшнего дня, никогда более не возвращаются к поддержке и доработке исходных кодов.
В связи с этим дальнейшие примеры кода будут базироваться на готовом решении, взятом из PEAR (репозиторий приложений и модулей PHP). Пакет, который будет использован в примерах, называется Mail_Mime. Скачать последнюю версию пакета и получить исчерпывающую документацию можно по адресу http://pear.php.net/package/Mail_Mime. Рассмотрим пример его использования:
<?php include('Mail.php'); include('Mail/mime.php'); $text = 'Text version of email'; $html = 'HTML version of email'; $file = '/home/richard/example.php'; $crlf = "\r\n"; $hdrs = array( 'From' => 'you@yourdomain.com', 'Subject' => 'Test mime message' ); $mime = new Mail_mime($crlf); $mime->setTXTBody($text); $mime->setHTMLBody($html); $mime->addAttachment($file, 'text/plain'); $body = $mime->get(); $hdrs = $mime->headers($hdrs); $mail =& Mail::factory('mail'); $mail->send('postmaster@localhost', $hdrs, $body); ?>
Приведенный код довольно понятен, но все же несколько слов о нем.
Переменная $mime является экземпляром класса Mail_mime. В его конструктор мы передали необязательный параметр, определяющий, какой именно перевод строки будет использован: “\n” или “\r\n”. Данный класс предназначен для формирования тела и заголовков отправляемого письма. При помощи метода setTXTBody мы определяем текстовую часть письма. В качестве параметра метод принимает строку или имя файла, который будет использован. Аналогично при помощи метода setHTMLBody мы задаем содержимое HTML-версии письма.
Рассмотрим метод addAttachment подробнее. Принимаемые параметры:
- string $dataПолный путь к прикрепляемому файлу на сервере либо его содержимое. Обязательный параметр.
- string $c_typeЗначение заголовка Сontent-type, который будет отправлен. Необязательный параметр, значение по умолчанию – application/octet-stream.
- string $nameИмя прикрепляемого файла. Будет использован только в случае, если первый параметр ($data) является содержимым файла.
- boolean $isfileОпределяет, является ли первый параметр путем к файлу. Необязательный параметр, значение по умолчанию – true.
- string $encodingЗначение заголовка Content-Transfer-Encoding, определяющего формат, в котором будет отправлено приложение. Необязательный параметр. Допустимые значения: base64 (используется для двоичных файлов), quoted-printable(используется для текстовых файлов). Значение по умолчанию: base64.
Таким образом, есть два способа применения данного метода.
- указывая путь к файлу на сервере:
$mime->addAttachment('/home/user/report.txt', 'text/plain');
- указывая содержимое файла (в таком случае третий и четвертый параметры необходимо указывать принудительно):
$mime->addAttachment($contentFile, 'text/plain', 'report.txt', false);
Переходим к формированию заголовка и тела письма. Это все еще обязанности экземпляра класса Mail_mime. Для формирования тела письма применяется метод get, который в качестве необязательного параметра принимает ассоциативный массив. Ключами могут выступать следующие значения: text_encoding, html_encoding, 7bit_wrap, text_charset, html_charset. Для формирования заголовков используется метод headers. В качестве необязательного параметра принимает хеш-массив. Для более детального ознакомления с допустимыми значениями данного параметра обратитесь к RFC-822.
Вызов метода get() должен осуществиться до того, как будет вызван метод headers(). Убедитесь, что в Вашем коде это условие соблюдено.
Сам процесс отправки уже сформированного письма возложен на класс Mail. Вначале необходимо при помощи статического вызова метода factory создать экземпляр данного класса. В нашем примере он принимает единственный параметр – строку ‘mail’. Более детально принимаемые параметры и их значения описаны ниже в статье, где описываются альтернативные способы отправки почты.
Процесс отправки почты завершается вызовом метода send, принимающего в качестве входящего параметра список адресатов, заголовки письма и его тело.
Проверку на ошибки, во время отправки письма, можно реализовать используя следующий код:
<?php $status =$mailer->send('user@your.domain.com', $headers, 'your message'); if (PEAR::isError($status)) { print("***ERROR"); } ?>
Немає коментарів:
Дописати коментар