С такой задачей сталкивалось огромнейшее количество разработчиков и, как следствие, существует огромнейшее количество готовых решений. Большинство из них содержит различного рода ошибки, реализовывает не всю функциональность или сложны в применении. Но самый весомый минус – подавляющая масса разработчиков после написания класса, отвечающего его личным потребностям сегодняшнего дня, никогда более не возвращаются к поддержке и доработке исходных кодов.
В связи с этим дальнейшие примеры кода будут базироваться на готовом решении, взятом из 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");
}
?>
Немає коментарів:
Дописати коментар