Magiys
Новичок
SMTP авторизация с использованием TLS
Приветствую все!
Возникла необходиомсть на сайте проводить smtp авторизацию на Gmail, но возникла проблема с протоколами. Я делаю так (команды и ответы через сокеты):
Скажите как продолжить? Толковой документации нет, а что есть то на английском. Что должно следовать после комманды STARTTLS?
Заранее очень благодарен за помощь.
-~{}~ 03.12.06 19:48:
Что никто не знает? Может ссылку какую дадите...
-~{}~ 04.12.06 14:27:
Ну может это поможет, хоя врдят ли, ведь дело в протоколе.
Видимо наши зарубежные коллеги более подкованы в этом деле, так как протоколы написаны на английском. А я даже не знаю, что дальше писать. Может кто хоть ссылку даст почитать, где это есть.
Приветствую все!
Возникла необходиомсть на сайте проводить smtp авторизацию на Gmail, но возникла проблема с протоколами. Я делаю так (команды и ответы через сокеты):
PHP:
C: EHLO gmail
R: 250-mx.google.com at your service, [xx.xxx.xx.xx]
R: 250-SIZE 20971520
R: 250-8BITMIME
R: 250-STARTTLS
R: 250 ENHANCEDSTATUSCODES
C: STARTTLS
R: 220 2.0.0 Ready to start TLS
Заранее очень благодарен за помощь.
-~{}~ 03.12.06 19:48:
Что никто не знает? Может ссылку какую дадите...
-~{}~ 04.12.06 14:27:
Ну может это поможет, хоя врдят ли, ведь дело в протоколе.
PHP:
// Директория для введения истории
$logs_directory = "logs_directory";
// E-mail для указания в авторизации
$smtp_email = "[email protected]";
// E-mail для указания в поле получателя
$smtp_to = "[email protected]";
// Имя пользователя для авторизации на почтовом сервере
$smtp_user = "[email protected]";
// Пароль для авторизации на почтовом сервере
$smtp_pass = "123456";
// Сервер для авторизации на почтовом сервере
$smtp_server = "smtp.gmail.com";
// E-mail для ответа
$ReplyTo = "[email protected]";
// Название системы отправителя
$XMailer = "The PHP Tools";
function EndConnect($connect, $file)
{
fwrite ($file, "<!!!Неверный ответ сервера.\nРазрыв соединения.\n");
fclose ($file);
fclose($connect);
exit;
}
function RunCommand($connect, $cmd, $file)
{
$smtp_msg = "";
$smtp_code = "";
fputs($connect, $cmd."\r\n");
while ($line = fgets($connect, 515)){$smtp_msg .= $line; if (substr($line, 3, 1) == " "){break;}}
fwrite ($file, $smtp_msg);
$smtp_code = substr($smtp_msg, 0, 3);
return $smtp_code==""?FALSE:$smtp_code;
}
function socketmail($to, $from, $subject, $message) {
Global $logs_directory, $smtp_to, $smtp_email, $smtp_user, $smtp_pass, $smtp_server, $ReplyTo, $XMailer;
// Формирование заголовков
$head = "To: ".$to."\r\n";
$head .= "From: ".$from."\r\n";
$head .= "Subject: ".$subject."\r\n";
$head .= "X-Mailer: ".$XMailer."\r\n";
$head .= "Reply-To: ".$ReplyTo."\r\n";
$head .= "Mime-Version: 1.0\r\n";
$head .= "Content-Type: text/html; charset=ISO-8859-1; format=flowed\r\n";
// Формирование тела письма
$data = $head."\r\n\r\n".$message;
// Текущая дата и время
$date_now = date("Y-m-d");
$time_now = date("H:i:s");
$logs_file_name = "logs".$date_now.".txt";
$logs_full_name = $logs_directory.$logs_file_name;
// Открытие файла истории
$m_file = fopen($logs_full_name, "a");
fwrite ($m_file, "======= ".$time_now." =======\n>Попытка соединения с почтовым сервером ".$smtp_server."...\n");
// Соединение с почтовым сервером
$connect = fsockopen($smtp_server, 587, $errno, $errstr, 30);
If ($connect == FALSE) // В случае неудачи записываем в историю
{
fwrite ($m_file, "<!!!Соединение не удалось. Ошибка (код ".$errno."): ".$errstr."\n");
fclose ($m_file);
exit;
}
fwrite ($m_file, "Соединение УСТАНОВЛЕНО.\n");
// Получение ответа
$smtp_msg = "";
while ($line = fgets($connect, 515)){$smtp_msg .= $line; if (substr($line, 3, 1) == " "){break;}}
// Проверка ответа (верный код ответа: 220)
$answer = substr($smtp_msg, 0, 3);
// Запись ответа
fwrite ($m_file, "<Ответ: ".$smtp_msg);
if($answer != '220'){EndConnect($connect, $m_file);}
fwrite ($m_file, "Ответ принят.\n");
fwrite ($m_file, ">Приветствие сервера: EHLO localhost\n");
// Приветствие сервера
$answer = RunCommand($connect, 'EHLO localhost', $m_file);
if($answer != '250'){EndConnect($connect, $m_file);}
fwrite ($m_file, "Ответ принят.\n");
fwrite ($m_file, ">Старт TSL: STARTTLS\n");
// Старт TSL
$answer = RunCommand($connect, 'STARTTLS', $m_file);
if($answer != '220'){EndConnect($connect, $m_file);}
fwrite ($m_file, "Ответ принят.\n");
fwrite ($m_file, ">Запрос на авторизацию: AUTH LOGIN\n");
// Запрос на авторизацию - ДАЛЬШЕ ПО СТАНДАРТУ НИЧЕГО НЕ РАБОТАЕТ, ТАК НУЖНО ИСПОЛЬЗОВАТЬ TLS КОМАНДЫ.
//$answer = RunCommand($connect, 'AUTH LOGIN', $m_file);
//if($answer != '334'){EndConnect($connect, $m_file);}
//fwrite ($m_file, "Ответ принят.\n");
//fwrite ($m_file, ">Отправка имени пользователя: ".$smtp_user." = ".base64_encode($smtp_user)."\n");
// Отправка имени пользователя
//$answer = RunCommand($connect, base64_encode($smtp_user), $m_file); // вводим логин
//if($answer != '334'){EndConnect($connect, $m_file);}
//fwrite ($m_file, "Ответ принят.\n");
//fwrite ($m_file, ">Отправка пароля: ".$smtp_pass." = ".base64_encode($smtp_pass)."\n");
// Отправка пароля
//$answer = RunCommand($connect, base64_encode($smtp_pass), $m_file); // и пароль
////if($answer != '235'){EndConnect($connect, $m_file);}
//fwrite ($m_file, "Ответ принят.\n");
//fwrite ($m_file, ">Передача ссылки на отправителя: MAIL FROM:<".$smtp_email.">\n");
// Передача ссылки на отправителя
//$answer = RunCommand($connect, 'MAIL FROM:<'.$smtp_email.'>', $m_file);
//if($answer != '250'){EndConnect($connect, $m_file);}
//fwrite ($m_file, "Ответ принят.\n");
//fwrite ($m_file, ">Передача ссылки на получателя: RCPT TO:<".$to.">\n");
// Передача ссылки на получателя
//$answer = RunCommand($connect, 'RCPT TO:<'.$to.'>', $m_file);
//if($answer != '250'){EndConnect($connect, $m_file);}
//fwrite ($m_file, "Ответ принят.\n");
//fwrite ($m_file, ">Метка на передачу тела письма: DATA\n");
// Метка на передачу тела письма
//$answer = RunCommand($connect, "DATA", $m_file);
//if($answer != '354'){EndConnect($connect, $m_file);}
//fwrite ($m_file, "Ответ принят.\n");
//fwrite ($m_file, ">Передача тела письма\n");
// Передача тела письма
//fputs($connect, $data."\r\n");
//$answer = RunCommand($connect, "\r\n.", $m_file);
//if($answer != '250'){EndConnect($connect, $m_file);}
//fwrite ($m_file, "Ответ принят.\n");
//fwrite ($m_file, ">Завершение сеанса\n");
// Завершение сеанса
$answer = RunCommand($connect, "QUIT", $m_file);
if($answer != '221'){EndConnect($connect, $m_file);}
fwrite ($m_file, "Ответ принят.\nРазрыв соединения\n");
// Завершение соединений с файлом истории и удаление ссылки на почтовый сервер из памяти.
fclose ($m_file);
fclose($connect);
}
// Содержимое письма
$messege = "
<HTML>
<HEAD>
<STYLE>
.link {
color: blue;
text-decoration: none;
}
.link:hover {
color: red;
text-decoration: underline;
}
</STYLE>
</HEAD>
<BODY>
<a class='link' href='http\\:[url]www.mylink.com[/url]'>Link</a>
</BODY>
</HTML>
";
socketmail("[email protected]", "[email protected]", "Новости [Дек, 03]", $messege);
?>