php - 使用 SSL 的流式套接字

标签 php sockets ssl smtp

我在 PHP 5.6 中遇到了流套接字和 SSL 的问题。 似乎 SSL 正在缓冲输出。 在下面的示例中,“ehlo”命令被忽略(服务器没有响应)。 但是当在“ehlo”之后发送其他内容时,例如fwrite 的另一个调用中的新行,服务器发送响应。

$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 就绪。

(它来自第一个 print_r)。

但是当行之后: fwrite($stream, "ehlo [127.0.0.1]\r\n"); 我添加了额外的套接字写入: fwrite($stream, "\n"); 输出正常:

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

我尝试使用 stunnel 来检查它是否是 PHP SSL 包装问题以及当我将 $host 更改为 $host = 'localhost:110;' 时(我的stunnel 配置)一切正常(无需添加特殊的 fwrite 方法)。

有人遇到过这个问题吗?

最佳答案

用此代码替换第一个 fget,以确保 fget 正确理解行终止:

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

关于php - 使用 SSL 的流式套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37882308/

相关文章:

php - Codeigniter 和 SQLite - 将 session 保存到数据库不起作用(ci_session)

ssl - 远程证书签名

python - 尽管在 Python 中握手失败,但仍获取服务器证书

Python Socket 下载/上传图像文件缺少二进制文件

ssl - 使用 OpenSSL 正确关闭 SSL 连接

php - 无法在 PHP 中构建自动完成文本框

php - 这是什么意思 : $foo = new $foo();?

php - Google pagespeed-insights API 截图解析

java - PrintWriter 仅使用 println 发送字符串而不打印

c++ - Qt上的UDP语音聊天