在php中使用fsockopen与gmail imap服务器通信时出现问题

在php中使用fsockopen与gmail imap服务器通信时出现问题,php,stream,gmail,imap,fsockopen,Php,Stream,Gmail,Imap,Fsockopen,我可以在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=fget

我可以在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;
}

?>
当我使用fgets的while循环更改代码时,它会继续加载,最后时间结束时不会显示任何内容

  <?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;
 }

 ?>

在我输出登录凭据后,我想在$out中看到服务器的回复。 我可以使用openssl从命令行查看电子邮件,所以我认为问题不在于我对imap的处理。 也许我遗漏了一些关于文件流的基本信息


谢谢

我认为最好使用标准PHP库与IMAP交互。
看看

循环挂起的原因是因为feof永远不会返回true,因为套接字在服务器关闭连接之前是活动的。如果您等待的时间足够长,最终循环将中断,服务器将回答“*BYE connection closed”

如果您在登录命令之前使用了“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命令中非常有效,但是如果正在获取的消息的字符串“a1fd20”位于0位置,那么循环也会过早中断(我认为这不会发生!)。

正如我在问题中所写的,我想使用fsockopen,不是专门用于imap,而是用于与php的任何服务器通信,neway thnx用于响应,但您可以尝试使用此库检查您与imap的连接问题。我已经使用了用于php的imap库,在其工作程序中,我也使用了命令行中的openssl,其工作程序也是,但无法使用fsockopen解决它…我知道这是旧的,但我遇到了完全相同的问题,一行,当我在循环中获取输出时,我什么也得不到,有人有解决方案吗?
fputs($sock,"a LOGIN user@gmail.com password\r\n");
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;