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?
Does np http://swiftmailer.org wykazują ten sam problem? Jeśli nie, to możesz porównać tę implementację z twoją. – VolkerK
Tak, ten kod testowy pochodzi z implementacji Swiftmailer. –
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