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
メソッドを追加せずに)完全に動作します。
誰かがこの問題に直面しましたか?
は、例えばいhttp://swiftmailer.orgにも同じ問題がありますか?もしそうでなければ、その実装とあなたのものを比較することができます_ – VolkerK
はい、そのテストコードはswiftmailerの実装から取得されています。 –
したがって、ssl://smtp.some.server.com:465でswiftmailerを使用しても、ハンドシェイクを完了していないため、動作しません。 – VolkerK