Отправка электронной почты а PHP

С отправкой электронной почты рано или поздно сталкивается каждый PHP-программист. И как оказывается, тут есть целый ряд нюансов. В своё время, я нашел интересную статью об этом, поэтому, привожу её тут. Заодно и сам буду вспоминать, как это делается :)


Trustmaster: Если у Вас возникли какие-либо вопросы по данному FAQ'у, замечания можно оставить в следующей теме: Обсуждение FAQ-ов

Отправка e-mail сообщений в PHP.

Здесь я попытаюсь кратко изложить основные возможности отправки электронной почты в PHP.

1. Функция mail().

Действия функции mail() зависят от операционной системы. В UNIX она попытается использовать процесс программы SendMail для отправки сообщения. В Windows она пытается использовать SMTP или же внутреннюю эмуляцию процесса SendMail.

Прототип функции выглядит так:
bool mail(string to, string subject, string message
[, string additional_headers [, string additional_parameters]]);

to содержит адрес получателя, subject - тему письма, message - содержимое (текст). В additional_headers можно поместить дополнительные HTTP заголовки, а additional_parameters - параметры вызова процесса sendmail.

К примеру, мы хотим отправить письмо некоему john@doe.com, причем указать обратный адрес admin@microsoft.com и почтовую программу "E-mail Terminator v.1000":
mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта",
"From: admin@microsoft.comrnX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!");


Подведем итоги.
Плюсы: простота и легкость в использовании.
Минусы: невозможность отправки писем с других серверов (кроме localhost), отсутствие поддержки SMTP аутентификации (для некоторых серверов), невозможность присоединения файлов, возможные проблемы при использовании почтовых служб, отличных от SendMail, в UNIX.


2. Сокеты.


Этот способ всех "ближе к телу". Здесь нам самим придется вникнуть в особенности протокола SMTP.
Итак, нам придется соединиться с почтовым сервером, создав сокет, "пообщаться" c сервером, отправить заголовки и текст письма, после чего закрыть соединение.
Для этого напишем свою простую функцию sock_mail():
function sock_mail($host, $to, $from, $subj, $message, $type)
{
if($type=="") $type="text/plain"; // Определям тип по умолчанию
// Соединение
$fp = fsockopen($host, 25); // Подключаемся на 25 порт сервера $host
// Приветствие
$log .= fgets($fp); // Читаем приветствие сервера
fputs($fp, "HELO: $host"); // Привет, сервер smile.gif
$log .= fgets($fp); // Читаем ответ
fputs($fp, "MAIL FROM:<$from>"); // Определяем пользователя
$log .= fgets($fp); // Читаем ответ
fputs($fp,"RCPT TO:<$to>"); // Определяем получателя
$log .= fgets($fp); // Читаем ответ
fputs($fp, "DATA"); // Приветствие окончено, теперь приступим к делу
$log .= fgets($fp); // Читаем ответ
// Заголовки
fputs($fp, "X-Mailer: Sock_Mail v.1.0"); // Название клиента (необязательно)
fputs($fp, "Reply-To: $from"); // Адрес, на который идут ответы (необязательно)
fputs($fp, "From: $from"); // Отправитель
fputs($fp, "Subject: $subj"); // Тема
fputs($fp, "MIME-Version: 1.0"); // Версия MIME (необязательно)
fputs($fp, "Content-Type: $type"); // Тип содержимого
fputs($fp,""); // Пустая строка
// Содержимое
fputs($fp, $message);
// Конец диалога
fputs($fp, ".");
$log .= fgets($fp); // Читаем ответ
fputs($fp, "QUIT"); // Сообщаем о выходе
$log .= fgets($fp); // Читаем ответ
// Завершение соединения
fclose($fp); // Закрываем сокет
return $log; // Возвращаем ответы сервера.
}

В принципе, эта та же функция mail(), только работает с любым сервером через соединение на 25-й порт. Чуть позже мы рассмотрим улучшенный вариант использования сокетов.
Исходник функции также можно найти в аттаче (файл sock_mail.php).

Подведем итоги.
Плюсы: соединение с любым почтовым сервером, неограниченные возможности по улучшению.
Минусы: все приходится писать самостоятельно.

Добавлено 16/08/2007 by Рысь:
Небольшое добавление про перенос строк :
Отправка почты (сообщение #1665050)

3. Библиотеки.


Существует огромное количество библиотек для работы с почтой. Большинство из них является лишь объектно-ориентированной надстройкой над стандартной mail(). Я не буду их сдесь рассматривать, так как у меня есть идея получше (см. ниже).

Подведем итоги.
Плюсы: объектно-ориентированный интерфейс, возможность прикрепления файлов.
Минусы: большинство таких библиотек наследуют недостатки функции mail().


4. Эксклюзив.


Специально для вас я модифицировал один из популярных классов Mail и интегрировал в него некоторые новые возможности так, чтобы он принимал во внимание особенности и недостатки всех описанных здесь методов.
Исходник класса можно найти в аттаче (файл mail.php), а здесь мы рассмотрим работу с этим классом.

4.0 Создание объекта:
$m = new Mail(); // Теперь $m - объект класса Mail


4.1 Метод Host(). Этот метод определяет имя сервера, который будет использован для отправки сообщения. По умолчанию будет использован localhost. Если вы хотите использовать другой сервер, нужно сделать это так:
$m->Host("mail.myhost.com"); // Будем отправлять писмо с mail.myhost.com


4.2 Метод Username() и Password(). Устанавливают имя пользователя и пароль для SMTP аутентификации. ВНИМАНИЕ: используйте только если сервер требует аутентификации для SMTP!
$m->Username("admin"); // Используем пользователя admin
$m->Password("sWordFiSH"); // Пароль - sWordFiSH


4.3 Метод Content_type(). Устанавливает тип содержимого письма.
$m->Content_type("text/html"); // Письмо в виде HTML


4.4 Метод autoCheck(). Проверять правильность адресов e-mail или нет? По умолчанию - false.
$m->autoCheck(true); // Будем проверять адреса


4.5 Метод Subject(). Устанавливает тему сообщения. Пример:
$m->Subject("How to make million dollars per day."); // Без комментариев


4.6 Метод From(). Устанавливает адрес отправителя. По умолчанию - nobody@localhost.
$m->From("user@host.com"); // Отправляем с адреса user@host.com


4.7 Метод ReplyTo(). Адрес, на который будут приходить ответы.
mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта",
"From: admin@microsoft.comrnX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!");
000

4.8 Метод To(). Добавляет нового адресата в список "To:". После вызова Send писмьмо будет отправлено по всем адресам из списка. Пример:
mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта",
"From: admin@microsoft.comrnX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!");
111

4.9 Метод Cc(). То же, что и метод To(), но для поля "CC:".

4.10 Метод Bcc(). То же, что и To(), но для "BCC" ("Blank Carbon Copy").

4.11 Метод Body(). Устанавливает текст сообщения, принимая его в качестве первого аргумента. В качестве второго аргумента можно (но необязательно) указать кодировку письма.
mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта",
"From: admin@microsoft.comrnX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!");
222

4.12 Метод Organization(). Устанавливает вашу организацию. Пример:
mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта",
"From: admin@microsoft.comrnX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!");
333

4.13 Метод Priority(). Устанавливает приоритет письма (1 - самый высокий, 2 - высокий, 3 - нормальный, 4 - низкий, 5 - самый низкий).
mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта",
"From: admin@microsoft.comrnX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!");
444

4.14 Метод Attach(). Прикрепляет файл к письму (можно прикреплять несколько файлов). Первый аргумент - путь к файлу, второй (необязательно) - его MIME тип, третий (необязательно) - его dispostion (inline - клиенту можно его отобразить, attachment - обязательно сохранить на диске), по умолчанию inline.
mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта",
"From: admin@microsoft.comrnX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!");
555

4.15 Метод Send(). Производит отправку письма:
mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта",
"From: admin@microsoft.comrnX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!");
666

4.16 Метод Get(). Выводит письмо таким, каким его получит клиент.
mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта",
"From: admin@microsoft.comrnX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!");
777


Подведем итоги.
Плюсы: универсальность и сочетание всех необходимых возможностей.
Минусы: надеюсь, что их нет...

Комментарии

Популярные сообщения