Собственная функция 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; просмотров: 629;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.007 сек.