2016-06-17 6 views
25

PHP 5.6でストリームソケットとSSLに問題があります。 SSLがバッファリングしているようです。 以下の例では、 "ehlo"コマンドは無視されます(サーバーが応答していません)。 "ehlo"の後に何か他のものが送信されると、 fwriteへの別の呼び出しの新しい行、サーバーは応答を送信します。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); 

は私が応答を持っている:

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

は、(それが最初print_rからです)。

しかしときの行の後に:fwrite($stream, "ehlo [127.0.0.1]\r\n");私は、追加のソケット書き込みを追加:fwrite($stream, "\n");出力は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 

私はそれがPHP SSLラッパーの問題だかどうかを確認するためのstunnelを使って試してみたと私は$host = 'localhost:110;'$hostを変更したとき(私のstunnelの設定)すべてが(特別なfwriteメソッドを追加せずに)完全に動作します。

誰かがこの問題に直面しましたか?

+0

は、例えばいhttp://swiftmailer.orgにも同じ問題がありますか?もしそうでなければ、その実装とあなたのものを比較することができます_ – VolkerK

+0

はい、そのテストコードはswiftmailerの実装から取得されています。 –

+0

したがって、ssl://smtp.some.server.com:465でswiftmailerを使用しても、ハンドシェイクを完了していないため、動作しません。 – VolkerK

答えて

1

関数fgetsが正しく行終了を理解しておくことを、このコードで第一のfgetsを置き換えます

$fgets = ''; 
while (is_resource($stream) && !feof($stream)) { 
    $fgets .= fgets($stream); 
} 
関連する問題