SMTP авторизация с использованием TLS

Magiys

Новичок
SMTP авторизация с использованием TLS

Приветствую все!

Возникла необходиомсть на сайте проводить 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
Скажите как продолжить? Толковой документации нет, а что есть то на английском. Что должно следовать после комманды STARTTLS?

Заранее очень благодарен за помощь.

-~{}~ 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);
?>
Видимо наши зарубежные коллеги более подкованы в этом деле, так как протоколы написаны на английском. А я даже не знаю, что дальше писать. Может кто хоть ссылку даст почитать, где это есть.
 

Гравицапа

elbirret elcno
Возникла необходиомсть на сайте проводить smtp авторизацию на Gmail, но возникла проблема с протоколами.
А можно узнать в связи с чем такая необходимость возникла?

-~{}~ 04.12.06 19:00:

Может кто хоть ссылку даст почитать, где это есть.
Ну вот смотри, ты в курсе про существование gmail, но не в курсе про существование google.com?
 

Magiys

Новичок
>А можно узнать в связи с чем такая необходимость возникла?
С тем что необходимо на сервере использовать отправку писем через gmail для пользователей системы, такая фитча будет. Не могу использовать PEAR, но это не главное. Нужно реализовать все это дело самому, чтобы проводить более тесную интеграцию в систему.
>Ну вот смотри, ты в курсе про существование gmail, но не в курсе про существование google.com?
В том то и дело, что я ничего не нашел.

-~{}~ 04.12.06 16:05:

Гравицапа, кстати спасибо, хоть кто-то отреагировал... ;)
 

Гравицапа

elbirret elcno
С тем что необходимо на сервере использовать отправку писем через gmail для пользователей системы, такая фитча будет.
А чем для пользователя отличаются письма, отправленные через gmail и через обычный локальный sendmail? Зачем куда-то коннектиться и отправлять через него письма?
 

Magiys

Новичок
Это особенности системы, различные особенности. Чтобы зарегистрироваться нужно, к примеру, иметь ящик на gmail. Там же и лоттерея будет, по номеру письма gmail и прочее лабуда. Вообщем сайт получается, который вокруг и около gmail крутиться.
 

Фанат

oncle terrible
Команда форума
ни одна из приведенных причин не отвечает на вопрос Гравицапа
у тебя есть вторая попытка.
 

Magiys

Новичок
Фанат, что тут не понятного? Отвечаю конкретно на ворос:
А чем для пользователя отличаются письма, отправленные через gmail и через обычный локальный sendmail?
Тем что пользователь хочет отправить письмо через Gmail, чтобы попробывать выйграть лоттерею. Так как это тематический ресурс посвященный Gmail, и странно было бы, если написать "Чтобы участвовать в лоттерее, нажмите на кнопку, которая отправит на email от gmail, указанный при регистрации, письмо с помощью почтовой системы gmail", а письма от правлять от yandex или mail, маскируясь в поле "FROM", мол от gmail вам пришло письмо. От gmail нужно отправлять так же и от того, что используются алгоритмы определения победителя лоттереи связанные с Gmail, а именно Message-ID.
Зачем куда-то коннектиться и отправлять через него письма?
На этот вопрос, ответ предполагается в первом ответе.
---
Именно необходимо использовать Gmail, так как сайт посвящен Gmail. И используются особенности этой системы.
--
 

Magiys

Новичок
Не в этом дело! Я для примера привел, какая разница там же не gmail будет указан в оригинальных загаловках.
--
Вижу никто не заинтересован помочь, а лишь пытаются меня разъубедить в том, что мне это не нужно.
 

Фанат

oncle terrible
Команда форума
Тебе пытаются объяснить, что прежде, чем писать свои почтовые системы, не худо бы сначала узнать - что такое электронная почта, и как она работает
 

Magiys

Новичок
Этим я и занимаюсь, спрашивая совета: где и что по этому поводу существует.
 

Фанат

oncle terrible
Команда форума
ну, спрашивай дальше.
желаю тебе творческих успехов
 
Сверху