амый простой способ отправить письмо при помощи PHP - воспользоваться стандартной функцией mail. Она имеет следующий синтаксис:
bool mail ( string to, string subject, string message [, string additional_headers [, string additional_parameters]])
Обязательные параметры:
E-mail получателя
Заголовок письма
Текст письма
Необязательные параметры:
Дополнительные заголовки письма
Дополнительные параметры командной строки
Возвращаемое значение::
true, если письмо было принято к доставке
false, в противном случае.
Простейший пример ее использования выглядит так:
<?php
mail("joecool@example.com", "My Subject", "Line 1 Line 2 Line 3");
?>
Если у Вас на экране появилась ошибка "Fatal error: Call to undefined function: mail()", это значит, что либо PHP собран без поддержки функции mail, либо она запрещена настройками сервера. Такая практика в последнее время широко распространена на бесплатных хостинговых серверах. Если Вы столкнулись с такой проблемой, воспользуйтесь возможностью отправки писем при помощи сокетов (sockets), детально описанной в разделе "альтернативные способы отправки писем". В случае, если Вы администратор системы, обратитесь к разделу "Как настроить сервер" и попробуйте устранить эту проблему как таковую.
Дополнительные заголовки письма (additional headers) могут использоваться для указания кодировки письма, адреса отправителя, обратного адреса и множества других опций. Они должны быть разделены переводом строк: комбинацией " ". Например, так:
<?php
mail("nobody@example.com", "the subject", $message,
"From: webmaster@ example.com "
."X-Mailer: PHP/" . phpversion());
?>
Перейдем к более сложному примеру. Предыдущие скрипты работали с форматом text/plain, теперь же попробуем отправить почту в формате HTML нескольким адресатам с указанием кодировки:
<?php
$to = "Mary <mary@example.com>, " ;
$to .= "Kelly <kelly@example.com>";
$subject = "Birthday Reminders for August";
$message = '
<html>
<head>
<title>Birthday Reminders for August</title>
</head>
<body>
<p>Here are the birthdays upcoming in August!</p>
</body>
</html>';
$headers = "Content-type: text/html; charset=windows-1251 ";
$headers .= "From: Birthday Reminder <birthday@example.com> ";
$headers .= "Bcc: birthday-archive@example.com ";
mail($to, $subject, $message, $headers);
?>
Комментарии к примеру: вначале мы определяем, кому адресовано письмо. Если получателей несколько, их адреса указываются в одной строке и разделяются запятыми. При задании заголовка и тела письма следите, чтобы кодировка, в которой они действительно написаны, совпадала с заявленной в заголовке charset.
В нашем примере переменная $headers состоит из четырех строк: в первых двух мы указываем тип отправляемого письма - HTML - и его кодировку. В следующих двух строках мы указываем адрес отправителя и адрес, по которому следует отправить скрытую копию письма.
Одна из часто возникающих проблем при отправке почты в koi8 - это формирование заголовка письма. Для ее решения необходимо воспользоваться следующим кодом, который переводит строку в кодировке win-1251 в понятный большинству почтовых клиентов koi8 заголовок.
<?php
$subject = '=?koi8-r?B?'.base64_encode(convert_cyr_string($subject, "w","k")).'?=';
?>
К примеру, заголовок "Почтовое уведомление" будет выглядеть как
=?koi8-r?B?8M/e1M/Xz8Ug1dfFxM/NzMXOycU=?=
Если Вы все сделали правильно, а получатель письмо не получает (помните, что временные издержки на доставку письма зависят от многих факторов и могут колебаться от нескольких минут до нескольких часов), убедитесь в том, что оно действительно отправилось. Это необходимо сделать в 2 этапа. Вначале попробуйте выполнить код:
<?php
if (mail("nobody@example.com", "the subject", "Example message",
"From: webmaster@example.com ")) {
echo "messege acepted for delivery";
} else {
echo "some error happen";
}
?>
В случае если уже на этом шаге Вы получили ошибку, это может означать, что у Вас либо не запущен sendmail (или другой транспортный агент), либо он неправильно настроен, либо существуют ошибки в php.ini. К примеру, в последнее время распространено правило не принимать письма, в которых не указан правильный заголовок Mail-from.
В случае, если сообщение было принято к отправке, попробуйте посмотреть файл /var/log/mail или попросить об этом Вашего администратора, так как для этого требуются права суперюзера (root). Это можно сделать при помощи команды tail /var/log/mail. В случае успешной отправки письма в log-файле должны появится строки нижеприведенного типа либо сообщение об ошибке:
Oct 2 00:21:02 l72 sendmail[131]: h91LL1DG000131: to=root, ctladdr=root (0/0), delay=00:00:01, xdelay=00:00:01, mailer=relay, pri=30225, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (h91LL1g1000134 Message accepted for delivery)
Oct 2 00:21:18 l72 sendmail[137]: h91LL1g1000134: to=, ctladdr= (0/0), delay=00:00:17, xdelay=00:00:16, mailer=local, pri=30774, dsn=2.0.0, stat=Sent
В любом случае попробуйте посмотреть раздел "Как настроить сервер".
2. Как отправить письмо 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 = " ";
$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. В его конструктор мы передали необязательный параметр, определяющий, какой именно перевод строки будет использован: " " или " ". Данный класс предназначен для формирования тела и заголовков отправляемого письма. При помощи метода 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");
}
?>
Для дальнейшего ознакомления с возможностями классов Mail и Mime_mail ознакомьтесь с разделами "Как отправить письмо с картинками", "Альтернативные способы отправки писем"
3. Как отправить письмо c картинками
Отправка письма с вложением и отправка HTML-письма с вложением существенно отличаются по своей природе. Конечно же, и те и те находятся в теле письма, закодированы в base64, но используемые в обоих случаях заголовки различаются. В данном разделе описывается, как отправить HTML-файл с внедренными (в отличие от прикрепленных) изображениями, используя класс Mime_mail. Подразумевается, что предыдущий раздел Вы уже прочитали.
<?php
include('Mail.php');
include('Mail/mime.php');
$text = 'Text version of email';
$html = '<html><body>HTML version of email<img src="image.jpg"></body></html>';
$file = '/tmp/image.jpg';
$crlf = " ";
$hdrs = array(
'From' => 'you@yourdomain.com',
'Subject' => 'Test mime message'
);
$mime = new Mail_mime($crlf);
$mime->setTXTBody($text);
$mime->addHTMLImage ($file, 'image/jpeg');
$mime->setHTMLBody($html);
$body = $mime->get();
$hdrs = $mime->headers($hdrs);
$mail =& Mail::factory('mail');
$mail->send('postmaster@localhost', $hdrs, $body);
?>
Отличие этого примера от приведенного в предыдущей главе - использование функции addHTMLImage. Она принимает следующие параметры:
string $data
полный путь к прикрепляемому изображению на сервере либо его содержимое. Обязательный параметр.
string $c_type
значение заголовка Сontent-type, который будет отправлен. Необязательный параметр, значение по умолчанию: application/octet-stream.
string $name
имя прикрепляемого изображения. Будет использовано только в случае, если первый параметр ($data) является содержимым файла.
boolean $isfile
определяет, является ли первый параметр путем к изображению. Необязательный параметр, значение по умолчанию: true.
Аналогично методу addAttachment существует два способа вызова этого метода: в качестве первого параметра можно указывать путь к изображению либо двоичные данные изображения. Во втором случае третий и четвертый параметры являются обязательными.
Особенность этого метода заключается в том, что каждому изображению при помощи заголовка Content-ID: <8820c4185> ставиться в соответствие уникальный ключ. После этого все ссылки на прикрепляемое изображение заменяются ссылками на его ключ. В результате, в пришедшем к получателю письме будет строка вида <IMG SRC="cid: 8820c4185">, которую почтовый клиент проанализирует, извлечет содержимое из соответствующей секции письма и "покажет картинку".
Более детальное описание MIME - заголовков предоставлено в разделе "MIME в разрезе".
4. Альтернативные способы отправки писем
На сегодняшний день распространены следующие способы отправки писем из php-скриптов:
Посредством вызова функции mail
Непосредственно вызовом sendmail-а
При помощи сокетов
Используя COM-объект
Первые три способа реализованы в классе PEAR::Mail, о котором было рассказано выше. Экземпляр этого класса должен создаваться посредством статического вызова метода factory (так называемый "паттерн фабрика"). Первый параметр метода определяет способ отправки письма, он может принимать одно из следующих значений: mail, sendmail, smtp. Второй параметр - массив, содержание которого зависит от значения первого параметра:
Значение 'mail' - отправка при помощи вызова стандартной функции, дополнительные параметры отсутствуют
Значение 'sendmail' - отправка непосредственно вызовом sendmail-а. Доступные дополнительные параметры:
sendmail_path - путь к программе на сервере;
sendmail_args - дополнительные параметры для командной строки.
Значение 'smtp' - отправка почты при помощи сокетов. Доступные дополнительные параметры:
host - IP адрес или доменное имя сервера, на котором запущен почтовый транспортый агент, готовый принимать почту, например localhost (для локального сервера) или mxs.mail.ru (для публичного сервера);
port - порт на котором он запущен, как правило 25-тый;
auth - логическое значение, которое указывает на необходимость SMTP авторизации, значение по умолчанию - false;
username - используется только при наличии SMTP авторизации, логин на сервере;
password - используется только при наличии SMTP авторизации, пароль на сервере.
Пример использования класса PEAR::Mail
<?php
$mail =& Mail::factory('smtp', array('host' => 'localhost', 'port' => 25));
$mail->send('postmaster@localhost', $hdrs, $body);
?>
В приложении к данной статье приведены примеры исходных кодов, реализовывающие все перечисленные способы отправки почты без применения класса PEAR::Mail
Источник: http://www.softportal.com/