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 

当我使用 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 的处理。也许我错过了一些关于文件流的基本知识。

谢谢。

4

2 回答 2

0

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

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”,那么循环仍然会过早中断(我认为无论如何都不会发生这种情况!)。

于 2014-02-20T12:48:40.940 回答
-1

我认为最好使用标准 PHP 库与 IMAP 交互。看看http://www.php.net/manual/en/book.imap.php

于 2011-08-25T19:39:53.213 回答