PHP curl在所有情况下都不返回数据

时间:2016-06-16 21:57:41

标签: php curl imap

我正在实现一个支持多个连接库的基本IMAP客户端 - php_imap,socket和curl。

php_imap和套接字方法工作正常。 curl方法适用于除FETCH之外的所有命令,因此我知道我的代码中没有错误。如果我通过套接字发送相同的命令它可以工作,所以我也知道我的命令没有错误。另外,如果我启用详细输出,我可以看到该消息实际上已被发回。

    function write($command) {
    $url = ($this->type == 'imap' ? 'imap' : 'pop3') . ($this->secure ? 's' : '') . '://' . $this->host . '/INBOX';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_USERPWD, "$this->username:$this->password");
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_PORT, $this->port);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->timeout);
    curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);

    $fp = tmpfile();
    curl_setopt($ch, CURLOPT_FILE, $fp);

    curl_setopt($ch, CURLOPT_VERBOSE, true);
    $verbose = fopen('php://temp', 'w+');
    curl_setopt($ch, CURLOPT_STDERR, $verbose);

    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $command);

    $res = curl_exec($ch);

    rewind($verbose);
    $verboseLog = stream_get_contents($verbose);
    echo($verboseLog);
    fclose($verbose);

    return $res;
    }

这有效:

write('STATUS "INBOX" (MESSAGES)');

返回空字符串(UID有效 - 适用于套接字)

$uid = 181;
write('UID FETCH ' . $uid . ' (BODY[])');

卷曲IMAP实施中是否存在错误?我已经用curl 7.30.0和7.35.0进行了测试

3 个答案:

答案 0 :(得分:1)

如果您需要用$ res答复

$res = curl_exec($ch);

您必须设置

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

否则curl将其发送到stdout

答案 1 :(得分:1)

由于某种原因,FETCH 数据作为标头数据返回,默认情况下通过管道传输到 stderr。您可以通过 CURLOPT_HEADERFUNCTION 回调捕获它。例如,要将其存储到文件中,如下所示:

    $fileHandle = tmpfile();
    curl_setopt($this->ch, CURLOPT_HEADERFUNCTION,
      function ($ch, $str) use ($fileHandle) {
        fwrite($fileHandle, $str);
        return strlen($str);
      }
    );

答案 2 :(得分:0)

如果您使用Apache HTTPd,请尝试重新启动它。
它用cURL请求中的空响应解决了我的问题。