Отправка письма с помощью PHP c вложением (attachment)

С такой задачей сталкивалось огромнейшее количество разработчиков и, как следствие, существует огромнейшее количество готовых решений. Большинство из них содержит различного рода ошибки, реализовывает не всю функциональность или сложны в применении. Но самый весомый минус - подавляющая масса разработчиков после написания класса, отвечающего его личным потребностям сегодняшнего дня, никогда более не возвращаются к поддержке и доработке исходных кодов.

В связи с этим дальнейшие примеры кода будут базироваться на готовом решении, взятом из 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><body>HTML version of email</body></html>';
$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.

Таким образом, есть два способа применения данного метода.

  1. указывая путь к файлу на сервере:
    $mime->addAttachment('/home/user/report.txt', 'text/plain');
  2. указывая содержимое файла (в таком случае третий и четвертый параметры необходимо указывать принудительно):
    $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");
}
?>

Выше реализована проверка ошибок при отправке письма.



Опубликовал admin
18 Июл, Воскресенье 2004г.



Программирование для чайников.