В каких случаях нужен PHP-скрипт отправки почты через SMTP? Несмотря на то, что в php есть готовая функция отправки почты mail(), в некоторых ситуациях этот скрипт обладает бОльшими возможностями.

1. Основная причина – это проблема фильтров антиспама.

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

2. Специфическая причина.
Можно полностью замаскировать письмо, как будто оно не было отправленно почтовой программой.

Итак, приступим к написанию скрипта:
После каждой передачи команды на сервер нужно будет получать ответ от сервера. Для этого сделаем функцию, которая будет работать с открытым соединением и получать ответ от сервера.

<?

function get_data($smtp_conn)

{

$data="";
while($str = fgets($smtp_conn,515))
{
$data .= $str;
if(substr($str,3,1) == " ") { break; }
}
return $data;
}
?>

Далее необходимо создать заголовки:

<?
$header="Date: ".date("D, j M Y G:i:s")." +0700\r\n";
$header.="From: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('test_1')))."?= <login@domain.ru>\r\n"; //, где Windows-1251 - кодировка, test_1 - от чьего имени отправляется почта, login@domain.ru - c какой почты необходимо отправлять

$header.="X-Mailer: The Bat! (v3.99.3) Professional\r\n";
$header.="Reply-To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('test_1')))."?= <login@domain.ru>\r\n"; //, где Windows-1251 - кодировка, test_1 - от чьего имени отправляется почта,
login@domain.ru - c какой почты необходимо отправлять
$header.="X-Priority: 3 (Normal)\r\n";
$header.="Message-ID: <172562218.".date("YmjHis")."@domain.ru>\r\n";    //, где domain.ru - почтовый домен
$header.="To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('test_2')))."?= <asd@domain.ru>\r\n"; //, где test_2 - имя адресата, asd@domain.ru - почтовый ящик адресата
$header.="Subject: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('проверка')))."?=\r\n"; //, где "проверка" - тема письма
$header.="MIME-Version: 1.0\r\n";
$header.="Content-Type: text/plain; charset=windows-1251\r\n";
$header.="Content-Transfer-Encoding: 8bit\r\n";
?>

Если письма отображаются в неправильной кодировке, то необходимо указать нужную кодировку вместо Windows-1251.

Переменную с заголовками создали, теперь создадим переменную с текстом самого письма.

$text="привет, проверка связи.";

Cейчас открываем соединение с smtp сервером.

$smtp_conn = fsockopen("smtp.mail.ru", 25,$errno, $errstr, 10);

После открытия соединения читаем ответ от сервера в переменную $data

$data = get_data($smtp_conn);

Для отправки писем выполняем следующие команды:

<?
fputs($smtp_conn,"EHLO vasya\r\n"); //, где
здороваемся с сервером, представляемся. Обычно после EHLO указывается имя вашего компьютера, можете указать любое произвольное имя
<$data = get_data($smtp_conn);

fputs($smtp_conn,”AUTH LOGIN\r\n”); //, где команда вызова авторизации
$data = get_data($smtp_conn);

fputs($smtp_conn,base64_encode(“login”).”\r\n”); //, где login – логин, необходимо ввести логин
$data = get_data($smtp_conn);

fputs($smtp_conn,base64_encode(“password”).”\r\n”); //, где password – пароль, необходимо ввести пароль
$data = get_data($smtp_conn);

// считаем количество символов письма со всеми заголовками, чтобы передать, какого размера будет письмо
$size_msg=strlen($header.”\r\n”.$text);

fputs($smtp_conn,”MAIL FROM:<login@domain.ru> SIZE=”.$size_msg.”\r\n”); //, где login@domain.ru – почтовый ящик-отправитель
$data = get_data($smtp_conn);

fputs($smtp_conn,”RCPT TO:<asd@domain.ru>\r\n”); //, где asd@domain.ru – почтовый ящик-получатель.
$data = get_data($smtp_conn);

fputs($smtp_conn,”DATA\r\n”);
$data = get_data($smtp_conn);

fputs($smtp_conn,$header.”\r\n”.$text.”\r\n.\r\n”);
$data = get_data($smtp_conn);

fputs($smtp_conn,”QUIT\r\n”);
$data = get_data($smtp_conn);
?>

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

$code = substr($data,0,3);
echo ($code);

Ниже приведен весь код php-скрипта:

<?
function get_data($smtp_conn)
{
$data="";
while($str = fgets($smtp_conn,515))
{
$data .= $str;
if(substr($str,3,1) == " ") { break; }
}
return $data;
}

$header="Date: ".date("D, j M Y G:i:s")." +0700\r\n";
$header.="From: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('test_1')))."?= <login@domain.ru>\r\n"; //, где Windows-1251 - кодировка, test_1 - от чьего имени отправляется почта, login@domain.ru - c какой почты необходимо отправлять

$header.="X-Mailer: The Bat! (v3.99.3) Professional\r\n";
$header.="Reply-To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('test_1')))."?= <login@domain.ru>\r\n"; //, где Windows-1251 - кодировка, test_1 - от чьего имени отправляется почта,
login@domain.ru - c какой почты необходимо отправлять
$header.="X-Priority: 3 (Normal)\r\n";
$header.="Message-ID: <172562218.".date("YmjHis")."@domain.ru>\r\n";    //, где domain.ru - почтовый домен
$header.="To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('test_2')))."?= <asd@domain.ru>\r\n"; //, где test_2 - имя адресата, asd@domain.ru - почтовый ящик адресата
$header.="Subject: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('проверка')))."?=\r\n"; //, где "проверка" - тема письма
$header.="MIME-Version: 1.0\r\n";
$header.="Content-Type: text/plain; charset=windows-1251\r\n";
$header.="Content-Transfer-Encoding: 8bit\r\n";

$text="привет, проверка связи.";

$smtp_conn = fsockopen("smtp.mail.ru", 25,$errno, $errstr, 10);

$data = get_data($smtp_conn);

//$code = substr($data,0,3);
//echo ($code);

fputs($smtp_conn,"EHLO vasya\r\n"); //, где здороваемся с сервером, представляемся. Обычно после EHLO указывается имя вашего компьютера, можете указать любое произвольное имя
$data = get_data($smtp_conn);

//$code = substr($data,0,3);
//echo ($code);

fputs($smtp_conn,"AUTH LOGIN\r\n"); //, где команда вызова авторизации
$data = get_data($smtp_conn);

//$code = substr($data,0,3);
//echo ($code);

fputs($smtp_conn,base64_encode("login")."\r\n"); //, где login - логин, необходимо ввести логин
$data = get_data($smtp_conn);

//$code = substr($data,0,3);
//echo ($code);

fputs($smtp_conn,base64_encode("password")."\r\n"); //, где password - пароль, необходимо ввести пароль
$data = get_data($smtp_conn);


//$code = substr($data,0,3);
//echo ($code);
// считаем количество символов письма со всеми заголовками, чтобы передать какого размера будет письмо
$size_msg=strlen($header."\r\n".$text);

fputs($smtp_conn,”MAIL FROM:<login@domain.ru> SIZE=”.$size_msg.”\r\n”); //, где login@domain.ru – почтовый ящик-отправитель
$data = get_data($smtp_conn);

//$code = substr($data,0,3);
//echo ($code);

fputs($smtp_conn,"RCPT TO:<asd@domain.ru>\r\n"); //, где asd@domain.ru - почтовый ящик-получатель.
$data = get_data($smtp_conn);

//$code = substr($data,0,3);
//echo ($code);

fputs($smtp_conn,"DATA\r\n");
$data = get_data($smtp_conn);

//$code = substr($data,0,3);
//echo ($code);

fputs($smtp_conn,$header."\r\n".$text."\r\n.\r\n");
$data = get_data($smtp_conn);

//$code = substr($data,0,3);
//echo ($code);

fputs($smtp_conn,"QUIT\r\n");
$data = get_data($smtp_conn);

//$code = substr($data,0,3);
//echo ($code);
?>