我正在实现一个支持多个连接库的基本IMAP客户端-php_imap,套接字和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[])');
curl IMAP实现中是否存在错误?我已经用卷曲7.30.0和7.35.0测试过
如果您需要在$ res中回复
$res = curl_exec($ch);
您必须设置
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
否则curl将其发送到stdout
如果使用Apache HTTPd,请尝试重新启动它。它用cURL请求中的空响应解决了我的问题。