2016-06-17 7 views
25

Ich habe ein Problem mit Stream-Socket und SSL in PHP 5.6. Es scheint, dass SSL die Ausgabe puffert. Im folgenden Beispiel wird der Befehl "ehlo" ignoriert (der Server reagiert nicht). Aber wenn etwas anderes nach "ehlo" gesendet wird, z.B. eine neue Leitung in einem anderen Anruf an fwrite, Server sendet Antwort.Stream-Socket mit 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); 

Ich habe eine Antwort bekam:

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

(es ist von der ersten print_r).

Aber wenn nach Zeile: fwrite($stream, "ehlo [127.0.0.1]\r\n"); ich zusätzliche Buchse Schreib hinzufügen: fwrite($stream, "\n"); Ausgang ist 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 

ich stunnel mit habe versucht, zu überprüfen, ob es sich um eine PHP-SSL-Wrapper Problem ist und wenn ich $host-$host = 'localhost:110;' ändern (meine Stunnel-Konfiguration) alles funktioniert perfekt (ohne die spezielle fwrite Methode hinzufügen).

Hat jemand dieses Problem konfrontiert?

+0

Hat z http://swiftmailer.org zeigen das gleiche Problem? Wenn nicht, könnten Sie diese Implementierung mit Ihrer vergleichen. – VolkerK

+0

Ja, dieser Testcode stammt aus der Implementierung von swiftmailer. –

+0

Also, wenn Sie Swiftmailer mit ssl: //smtp.some.server.com: 465 verwenden, funktioniert es nicht, weil es den Handshake nicht abschließt? – VolkerK

Antwort

1

1. fgets mit diesem Code ersetzen, sicher fgets verstehen Leitungsabschluss korrekt sein:

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