使用PHP中的fsockopen与Gmail IMAP服务器通信时出现问题

3
我可以使用PHP中的imap函数和命令行中的openssl进行通信,并希望尝试使用PHP中的fsockopen()函数。 我的代码是:
<?php

$sock=fsockopen('ssl://imap.gmail.com', '993',$errno, $errstr);
if(!$sock){
   echo $errstr;
}
else{
   fputs($sock,"a LOGIN user@gmail.com password\r\n");
   $out=fgets($sock,2000);
   fclose($sock);
   echo $out;
}

?>

问题在于我只能得到服务器返回的第一个响应,存储在$out中。
      * OK Gimap ready for requests from **.***.63.101 jj5if832612pbc.164 

当我用while循环替换fgets的代码时,它一直在加载,最终超时没有显示任何内容。

  <?php

  $sock=fsockopen('ssl://imap.gmail.com', '993', $errno, $errstr);
  if(!$sock){
      echo $errstr;
  }
  else{
      fputs($sock,"a LOGIN user@gmail.com password\r\n");
      while(!feof($sock)){
      $out.=fgets($sock,2000);
      }
 fclose($sock);
 echo $out;
 }

 ?>

我希望在我将登录凭据fputs到服务器后,能够在$out中看到服务器的回复。我能够使用openssl从命令行查看我的电子邮件,因此我认为问题不在于我的imap处理方式。也许我对文件流有一些基本的误解。
谢谢。
2个回答

0
你的循环陷入无限等待的原因是因为feof从未返回true,因为套接字一直存在,直到服务器关闭连接。如果你等足够长时间,最终循环将被打破,服务器会回答“* BYE connection closed”。
fputs($sock,"a LOGIN user@gmail.com password\r\n");

如果您在登录命令之前使用了"a",那么我使用的方法可能会非常不愉快,因此请将"a"更改为类似于"1a23ef"或其他任何内容,以便在获取数据时不会过早地中断循环,同时记得在每个新命令之前使用相同的密钥:

fputs($sock,"a1fd20 LOGIN user@gmail.com password\r\n");
while(true){
 $r = fgets($sock);
  $out .= $r;
  if(strpos($r, 'a1fd20 ') === 0){
   break;
  }
}
echo $out;

使用FETCH 1:1 RFC822命令效果不错,但如果被获取的邮件在位置0处包含字符串"a1fd20",循环也会过早中断(我认为这种情况不太可能发生!)。


-1

正如我在问题中所写的,我想使用fsockopen,不仅仅是针对imap,而是任何与php进行服务器通信的情况。无论如何,谢谢您的回复。 - karyboy
但是你可以尝试使用这个库来检查你的 IMAP 连接问题。 - Andrej
我已经在PHP中使用了IMAP库,它在那里工作得很好。我还从命令行中使用了OpenSSL,也在那里正常工作。但是,我只是无法弄清楚如何使用fsockopen。 - karyboy
我知道这个问题有点老了,但是我遇到了完全相同的问题,只有一行代码,在循环中获取输出时什么也没有,有人有解决方案吗? - MikeGA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接