【问题标题】:problem communicating with gmail imap server using fsockopen in php在 php 中使用 fsockopen 与 gmail imap 服务器通信的问题
【发布时间】:2026-01-24 00:25:02
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: php stream gmail imap fsockopen


    【解决方案1】:

    你的循环挂起的原因是因为 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”,那么循环也会过早中断(我认为无论如何都不会发生这种情况!)。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 正如我在问题中所写,我想使用 fsockopen ,不是专门用于 imap 而是用于与 php 的任何服务器通信,neway thnx 用于响应
      • 但是您可以尝试使用此库检查 imap 的连接问题。
      • 我已经使用了 imap 库 for php,n 它的工作 der,我也从命令行使用了 openssl,它的工作 der 也是,但只是无法使用 fsockopen 来计算它....跨度>
      • 我知道这很旧,但我遇到了完全相同的问题,一行,当我在循环中获取输出时,我什么也得不到,有人有解决方案吗?