2016-06-17 33 views
25

Mam problem z gniazdem strumieniowym i SSL w PHP 5.6. Wygląda na to, że protokół SSL buforuje dane wyjściowe. W poniższym przykładzie polecenie "ehlo" jest ignorowane (serwer nie odpowiada). Ale gdy coś innego zostanie wysłane po "ehlo", np. nowa linia w innym połączeniu z fwrite, serwer wysyła odpowiedź.Gniazdo strumieniowe z SSL

$errno = ''; 
$errstr = ''; 
$timeout = 5; 
$streamContext = stream_context_create(); 
$host = 'ssl://smtp.some.server.com:465'; 
$stream = stream_socket_client($host, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $streamContext); 
stream_set_blocking($stream, 1); 
stream_set_timeout($stream, $timeout); 
stream_set_write_buffer($stream, 0); 

$fgets = fgets($stream); 
print_r($fgets); 

fwrite($stream, "ehlo [127.0.0.1]\r\n"); 

$response = ''; 
do { 
    $line = fgets($stream); 
    $response .= $line; 
} while (null !== $line && false !== $line && ' ' != $line{3}); 

print_r($response); 

fclose($stream); 

mam odpowiedź:

220 epicserver.net.pl ESMTP IdeaSmtpServer v0.80.2 ready.

(to jest od pierwszego print_r).

Ale gdy po linii: fwrite($stream, "ehlo [127.0.0.1]\r\n"); dodam dodatkowy zapis gniazda: fwrite($stream, "\n"); wyjście jest ok:

220 epicserver.net.pl ESMTP IdeaSmtpServer v0.80.2 ready. 
250-epicserver.net.pl Hello ip-166-242.pl [94.183.162.232], pleased to meet you 
250-PIPELINING 
250-ENHANCEDSTATUSCODES 
250-SIZE 
250-8BITMIME 
250-AUTH PLAIN LOGIN 
250-AUTH=PLAIN LOGIN 
250 HELP 

Próbowałem za pomocą stunnel, by sprawdzić, czy jest to wrapper problem PHP SSL i kiedy zmienić $host do $host = 'localhost:110;' (moja konfiguracja stunnel) wszystko działa idealnie (bez dodawania tej specjalnej metody fwrite).

Czy ktoś napotkał ten problem?

+0

Does np http://swiftmailer.org wykazują ten sam problem? Jeśli nie, to możesz porównać tę implementację z twoją. – VolkerK

+0

Tak, ten kod testowy pochodzi z implementacji Swiftmailer. –

+0

Tak więc, jeśli używasz programu swiftmailer z ssl: //smtp.some.server.com: 465, to nie działa, ponieważ nie kończy uzgadniania? – VolkerK

Odpowiedz

1

Wymień 1st fgets z tego kodu, aby mieć pewność, fgets zrozumieć zakończenie linii poprawnie:

$fgets = ''; 
while (is_resource($stream) && !feof($stream)) { 
    $fgets .= fgets($stream); 
}