Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Сеть > Отправка писем с ящика gmail.com


Автор: dimaf1 8.9.2011, 14:36
       Скрипт должен с помощью fsockopen() соединиться с сервером smtp.gmail.com, затем пройти авторизацию и отправить письмо на несколько ящиков. Все идет нормально до того момента когда подается запрос на авторизацию, начиная с этого момента smtp сервер возвращает пустые ответы на все запросы к нему, и письма не отправляются (ни каких ошибок не выскакивает):
        Вот скрипт:    
Код

    $server = 'smtp.gmail.com';
    $port = 587;
    $user = 'username@gmail.com';
    $password = 'password';
        
    //Подключаемся к серверу smtp (если все нормально то в ответе первые три символа будут 220)
    echo "<br><br><b>Подключение к серверу $server порт $port:</b> ";
    if ($mail_handle = fsockopen($server, $port, $errno, $errstr, 20)) {
        echo fgets($mail_handle, 1024);
    }
    else {
        echo "Произошла ошибка!<br><b>$errno: $errstr</b>";
    }
    
    
    //Приветствуем сервер (если все нормально то в ответе первые три символа будут 250)
    echo "<br><br><b>Приветствуем сервер $server:</b> ";
    fwrite($mail_handle, "EHLO gmail.com \r\n");
    echo get_data($mail_handle);
    
    //Подаем запрос STARTTLS (если все нормально то в ответе первые три символа будут 220)
    echo "<br><br><b>Подаем запрос STARTTLS на $server:</b> ";
    fwrite($mail_handle, "STARTTLS\r\n");
    echo fgets($mail_handle, 1024);

///////////////////НАЧИНАЯ С ЭТОГО МЕСТА SMTP СЕРВЕР ВОЗВРАЩАЕТ ПУСТЫЕ ОТВЕТЫ///////////////////////

    //Запрос на авторизацию (если все нормально то в ответе первые три символа будут 334)
    echo "<br><br><b>Подаем запрос на авторизацию $server:</b> ";
    fwrite($mail_handle, "AUTH LOGIN\r\n");
    echo fgets($mail_handle, 1024);
    
    //Вводим логин и пароль (если все нормально то в ответе первые три символа будут 334)
    echo "<br><b>Вводим логин $server:</b> ";
    fwrite($mail_handle, base64_encode($user) . "\r\n");
    echo fgets($mail_handle, 1024);    
    
    //Вводим логин и пароль (если все нормально то в ответе первые три символа будут 235)
    echo "<br><b>Вводим пароль $server:</b> ";
    fwrite($mail_handle, base64_encode($password) . "\r\n");
    echo fgets($mail_handle, 1024);
    
    //Сообщаем автора нашего письма, т.е. наш e-mail (если все нормально то в ответе первые три символа будут 250)
    echo "<br><br><b>Сообщаем автора нашего письма, т.е. наш e-mail $server:</b> ";
    fwrite($mail_handle, "MAIL FROM: <username@gmail.com>\r\n");
    echo fgets($mail_handle, 1024);

    //Сообщаем куда мы хотим отправить письмо (если все нормально то в ответе первые три символа будут 250)
    echo "<br><b>Сообщаем куда мы хотим отправить письмо $server:</b>";
    fwrite($mail_handle, "RCPT TO: <username1@mail.ru>\r\n");
    echo "<br>RCPT TO: <username1@mail.ru>: " . fgets($mail_handle, 1024);    
    fwrite($mail_handle, "RCPT TO: <username2@yandex.ru>\r\n");
    echo "<br>RCPT TO: <dima-f1-for-reg@yandex.ru>: " . fgets($mail_handle, 1024);    
    fwrite($mail_handle, "RCPT TO: <username3@gmail.com>\r\n");
    echo "<br>RCPT TO: <admin@dima-f1-learn.16mb.com>: " . fgets($mail_handle, 1024);
    
    //Сообщаем о начале составления тела письма (если все нормально то в ответе первые три символа будут 354)
    echo "<br><b>Сообщаем о начале составления тела письма $server:</b> ";
    fwrite($mail_handle, "DATA\r\n");
    echo fgets($mail_handle, 1024);    
    
    //Отправляем письмо (если все нормально то в ответе первые три символа будут 250)
    echo "<br><b>Отправляем письмо $server:</b> ";
    $header="Subject: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('Проверка')))."?=\r\n";
    $message = "Проверка";
    fwrite($mail_handle, $header . "\r\n" . $message . "\r\n.\r\n");
    echo fgets($mail_handle, 1024);    
    
    //Заканчиваем работу с сервером (если все нормально то в ответе первые три символа будут 221)
    echo "<br><b>Заканчиваем работу с сервером $server:</b> ";
    fwrite($mail_handle, "QUIT\r\n");
    echo fgets($mail_handle, 1024);        
    
    fclose($mail_handle);
              
             Результат работы скрипта:
Код

Подключение к серверу smtp.gmail.com порт 587: 220 mx.google.com ESMTP a3sm345585bkd.11 
Приветствуем сервер smtp.gmail.com: 250-mx.google.com at your service, [95.134.24.223] 250-SIZE 35882577 250-8BITMIME 250-
STARTTLS 250 ENHANCEDSTATUSCODES 
Подаем запрос STARTTLS на smtp.gmail.com: 220 2.0.0 Ready to start TLS 
Подаем запрос на авторизацию smtp.gmail.com: 
Вводим логин smtp.gmail.com: 
Вводим пароль smtp.gmail.com: 
Сообщаем автора нашего письма, т.е. наш e-mail smtp.gmail.com: 
Сообщаем куда мы хотим отправить письмо smtp.gmail.com:

RCPT TO: : 
RCPT TO: : 
RCPT TO: : 
Сообщаем о начале составления тела письма smtp.gmail.com: 
Отправляем письмо smtp.gmail.com: 
Заканчиваем работу с сервером smtp.gmail.com:



             С smtp.mail.ru и с smtp.yandex.ru этот скрипт работает нормально, все письма нормально отправляются и доходят до адресатов (только там подключаюсь через 25 порт и не посылаю серверу запрос STARTTLS).

            Кто шарит в чем проблема подскажите.

Автор: Absinthe 8.9.2011, 18:11
Все просто: сравни с тем, что посылает почтовый клиент.
Но задача твоя мне не понятно: почему тебя не устраивает PhpMailer?

Автор: dimaf1 10.9.2011, 09:23
Цитата(Absinthe @ 8.9.2011,  18:11)
Все просто: сравни с тем, что посылает почтовый клиент.
Но задача твоя мне не понятно: почему тебя не устраивает PhpMailer?

У меня в PhpMailer, тоже не получается отправить письмо с gmail.com

Автор: Absinthe 10.9.2011, 11:00
Код

        $mail->IsSMTP();
        $mail->SMTPAuth   = true;
        $mail->SMTPSecure = "ssl";
        $mail->Host       = "smtp.gmail.com";
        $mail->Port       = 465;
        $mail->Username   = $config['from'];
        $mail->Password   = $config['password'];

Автор: dimaf1 10.9.2011, 12:37
Цитата(Absinthe @ 10.9.2011,  11:00)
Код

        $mail->IsSMTP();
        $mail->SMTPAuth   = true;
        $mail->SMTPSecure = "ssl";
        $mail->Host       = "smtp.gmail.com";
        $mail->Port       = 465;
        $mail->Username   = $config['from'];
        $mail->Password   = $config['password'];

Все это я уже пробовал.

В этом варианте:
Код

    $mail->IsSMTP();
    $mail->Host = smtp.gmail.com;
    $mail->SMTPDebug = 2;
    $mail->SMTPAuth = TRUE;
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;
    $mail->Username = $user;
    $mail->Password = $password;
    $mail->SetFrom($from_address, $from_name);
    $mail->AddAddress($to_address, $to_name);
    $mail->Subject = "The message from php script with PHPMailer (MAIL())";
    $mail->Body = $body;

На локальном хосте и на бесплатном хостинге www.ayola.net возвращает ошибку:
Код

SMTP -> ERROR: Failed to connect to server: Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP? (105663936) 
SMTP Error: Could not connect to SMTP host.


А в этом случае:
Код

    $mail->IsSMTP();
    $mail->Host = smtp.gmail.com;
    $mail->SMTPDebug = 2;
    $mail->SMTPAuth = TRUE;
    $mail->SMTPSecure = 'tls';
    $mail->Port = 587;
    $mail->Username = $user;
    $mail->Password = $password;
    $mail->SetFrom($from_address, $from_name);
    $mail->AddAddress($to_address, $to_name);
    $mail->Subject = "The message from php script with PHPMailer (MAIL())";
    $mail->Body = $body;

На локальном хосте возвращает ошибку:
Код

SMTP -> FROM SERVER:220 mx.google.com ESMTP g1sm4165433fad.24 
SMTP -> FROM SERVER: 250-mx.google.com at your service, [95.134.129.190] 250-SIZE 35882577 250-8BITMIME 250-STARTTLS 250 ENHANCEDSTATUSCODES 
SMTP -> FROM SERVER:220 2.0.0 Ready to start TLS 

Warning: stream_socket_enable_crypto() [streams.crypto]: this stream does not support SSL/crypto in Z:\home\PHPMailer\www\class.smtp.php on line 197

А на хостинге www.ayola.net возвращает ошибку:
Код

SMTP -> ERROR: Failed to connect to server: Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP? (105663936) 
SMTP Error: Could not connect to SMTP host.


На локальном хосте в php.ini extension=php_openssl.dll разрешен, на www.ayola.net - незнаю.

Автор: Absinthe 10.9.2011, 13:11
Ну а в чем тогда прикол задавать левый вопрос, когда сам прекрасно знаешь причину?

Подскажу:
Цитата

На локальном хосте и на бесплатном хостинге www.ayola.net возвращает ошибку:
Код

  SMTP -> ERROR: Failed to connect to server: Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP? (105663936) 
SMTP Error: Could not connect to SMTP host.



phpinfo(), http://www.php.net/manual/en/openssl.installation.php
Что касается хостинга - требуй поддержки от админа(сомневаюсь, что на бесплатном хостинге такое есть).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)