Собственная функция mail()
Отправить сообщение с локальной машины можно, не прибегая к функции mail (). Для этого необходимо разработать приложение SMTP-клиента, которое будет соединяться с удаленным SMTP-сервером. В РНР отсутствуют функции для работы с SMTP-серверами, поэтому далее рассмотрим разработку собственной функции для работы с удаленным SMTP-сервером.
Отправка сообщений подобным образом будет работать только в тех случаях, если почтовый сервер является открытым ретранслятором, или ваш IP-адрес является для него разрешенным. Однако в последнее время в целях борьбы со спамерскими рассылками ретрансляторы стараются закрывать, а системные администраторы организаций не разрешают отправку почты с адресов, не находящихся в собственной подсети. Таким образом, наша задача состоит в создании функций для отправки сообщений электронной почты, которая будет соединяться с удаленным SMTP- сервером и организовывать SMTP-сеанс, во время которого будет происходить отправка сообщения.
// Отправка сообщения через удаленный SMTP-сервер
<?php
// Функция отправки сообщения: открывает сокет, ведет диалог с сервером,
// записывает данные, закрывает сокет
function send($server, $to, $from, $subject="",$msg, $headers="")
{
// Формируем поля заголовка
$headers="To: $to\nFrom: $frcro\nSubject: $subject\nX-Mailer: MyMailer\n$headers";
// Соединяемся с сервером по порту 25,
// при этом переменная $fp содержит дескриптор соединения
$fp = fsockopen($server, 25, &$errno, &$errstr, 30);
if (!$fp)
die("Server $server. Connection failed: $errno, $errstr");
// Если соединение прошло успешно, производим запись данных в сокет,
// т. е. открываем наш 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().
string getmxrr(string hostname, array mxhost, [, array weight])
Эта функция принимает в качестве аргумента имя хоста hostname в данном домене и заполняет массив mxhost списком почтовых ретрансляторов этого домена. Если указан третий необязательный аргумент weight, то функция заполняет его значениями предпочтения, которые возвращает ей почтовый ретранслятор.
// Получение списка почтовых ретрансляторов для Windows
<?php
function win_getmxrr($hostname, &$mxhosts, &$mxweight=false) {
if (strtoupper(substr(PHP_OS, 0, 3)) != 'WIN') return;
if (!is_array ($mxhosts) ) $mxhosts = array();
if (empty($hostname)) return;
$exec='nslookup -type=MX '.escapeshellarg($hostname);
@exec($exec, $output);
if (empty($output)) return;
$i=-1;
foreach ($output as $line) {
$i++;
if(preg_match("/^$hostname\tMX preference = ([0-9]+), mail exchanger = (.+)$/i", $line, $parts))
{
$mxweight[$i] = trim($parts[1]);
$mxhosts[$i] = trim($parts[2]);
}
if (preg_match('/responsible mail addr = (.+)$/i', $line, $parts)) {
$mxweight[$i] = $i;
$mxhosts[$i] = trim($parts[1]);
}
}
return ($i!=-1);
}
if (!function_exists('getmxrr')) {
function getmxrr($hostname, &$mxhosts, &$mxweight=false) {
return win_getmxrr($hostname, $mxhosts, $mxweight);
}
}
/* example */
$domain='ukr.net';
echo "<pre>";
getmxrr($domain,$mxhosts,$mxweight);
print_r($mxhosts);
print_r($mxweight);
?>
Дата добавления: 2015-08-26; просмотров: 672;