Отправить сообщение с локальной машины можно, не прибегая к функции mail (). Для этого необходимо разработать приложение SMTP-клиента, которое будет соединяться с удаленным SMTP-сервером. В РНР отсутствуют функции для работы с SMTP-серверами, поэтому далее рассмотрим разработку собственной функции для работы с удаленным SMTP-сервером.
Отправка сообщений подобным образом будет работать только в тех случаях, если почтовый сервер является открытым ретранслятором, или ваш IP-адрес является для него разрешенным. Однако в последнее время в целях борьбы со спамерскими рассылками ретрансляторы стараются закрывать, а системные администраторы организаций не разрешают отправку почты с адресов, не находящихся в собственной подсети. Таким образом, наша задача состоит в создании функций для отправки сообщений электронной почты, которая будет соединяться с удаленным SMTP- сервером и организовывать SMTP-сеанс, во время которого будет происходить отправка сообщения.
// Отправка сообщения через удаленный SMTP-сервер
<?php
// Функция отправки сообщения: открывает сокет, ведет диалог с сервером,
// записывает данные, закрывает сокет
function send($server, $to, $from, $subject="",$msg, $headers="")
// Если соединение прошло успешно, производим запись данных в сокет,
// т. е. открываем наш SMTP-сеанс с удаленным сервером $server
fputs($fp,"HELO $server\n"); // Здороваемся с сервером
// Посылаем поле from
fputs($fp,"MAIL FROM: $from\n");
// Посылаем поле То
fputs($fp,"RCPT TO: $to\n");
// Посылаем поле Data
fputs($fp,"DATA\n");
// Посылаем сообщение, которое содержится в переменной $msg
fputs ($fp, "$msg\r\n" . ". " . "\r\n") ;
// Завершаем SMTP-сеанс
fputs($fp,"\n.\nQUIT\n");
// Завершаем соединение
fclose($fp);
}
// Отправка сообщения
send('mx2.yandex.ru', // Почтовый ретранслятор, к примеру, сервера yandex
'mail@yandex.ru', // Кому
'mail@softtime.ru', // От кого
'Hello!', // Тема
'Привет!'); // Сообщение
?>
В начале функции происходит соединение с почтовым ретранслятором удаленного SMTP-сервера по 25-му порту с помощью функции fsockopen. Затем серверу отправляются SMTP-команды. Текст сообщения должен заканчиваться строчкой на отдельной странице, поэтому точка обязательно должна присутствовать в строке отправки текста сообщения:
fputs($fp, "$msg\r\n.\r\n");
Узнать, какое имя имеют почтовые ретрансляторы конкретного SMTP- сервера, можно при помощи функция getmxrr().
Эта функция принимает в качестве аргумента имя хоста hostname в данном домене и заполняет массив mxhost списком почтовых ретрансляторов этого домена. Если указан третий необязательный аргумент weight, то функция заполняет его значениями предпочтения, которые возвращает ей почтовый ретранслятор.
// Получение списка почтовых ретрансляторов для Windows
<?php
function win_getmxrr($hostname, &$mxhosts, &$mxweight=false) {
if (strtoupper(substr(PHP_OS, 0, 3)) != 'WIN') return;
Для отправки сообщений электронной почты с вложениями необходимо использование MIME — спецификации, расширяющей возможности стандартной электронной почты.
Спецификация MIME (Multipurpose Internet Mail Extensions, многоцелевые расширения почты Интернета) описана в RFC 2045-2049. Спецификация MIME позволяет расширить возможности обычной электронной почты для решения следующих задач:
· пересылки восьмибитовых текстов и восьмибитовых символов в заголовке сообщения;
· пересылки двоичных данных любого типа (графики, аудио, видео и т. д.);
· поддержки сложных типов сообщений (к примеру, сообщений, содержащих данные различных типов).
// Отправка сообщений с вложениями
<?php
// Текст сообщения
$msg = "Привет!";
// Путь к файлу. В данном случае предполагается, что файл