php - Stream socket con SSL
sockets smtp (1)
Tengo un problema con Stream Socket y SSL en PHP 5.6. Parece que SSL está amortiguando la salida. En el ejemplo siguiente, se ignora el comando "ehlo" (el servidor no responde). Pero cuando se envía algo más después de "ehlo", por ejemplo, una nueva línea en otra llamada a fwrite
, el servidor envía una respuesta.
$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);
Tengo una respuesta:
220 epicserver.net.pl ESMTP IdeaSmtpServer v0.80.2 ready.
(es de la primera print_r
).
Pero cuando después de la línea: fwrite($stream, "ehlo [127.0.0.1]/r/n");
Agrego escritura de socket adicional: fwrite($stream, "/n");
la salida está bien:
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
He intentado usar stunnel para comprobar si se trata de un problema de contenedor SSL de PHP y cuando cambio $host
a $host = ''localhost:110;''
(mi configuración de stunnel) todo funciona perfectamente (sin agregar ese método especial de fwrite
).
¿Alguien se enfrentó a ese problema?
Reemplace los primeros elementos con este código, para asegurarse de que comprende la terminación de línea correctamente:
$fgets = '''';
while (is_resource($stream) && !feof($stream)) {
$fgets .= fgets($stream);
}