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

发布于 2024-12-01 08:26:19 字数 1208 浏览 2 评论 0原文

我能够使用 php 中的 imap 函数进行通信,也可以使用命令行中的 openssl 进行通信,我只是想尝试在 php 中执行 fsockopen() 。 我的代码是:

<?php

$sock=fsockopen('ssl://imap.gmail.com', '993',$errno, $errstr);
if(!$sock){
   echo $errstr;
}
else{
   fputs($sock,"a LOGIN [email protected] 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 [email protected] password\r\n");
      while(!feof($sock)){
      $out.=fgets($sock,2000);
      }
 fclose($sock);
 echo $out;
 }

 ?>

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

谢谢。

i m able to communicate using the imap functions in php and also using the openssl from commandline ,i just wanted to try this doing fsockopen() in php.
my code is :

<?php

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

?>

the problem is i get just the first response from the server in $out

      * OK Gimap ready for requests from **.***.63.101 jj5if832612pbc.164 

and when i change the code with the while loop for fgets ,it keeps on loading and in the end time's out without showing anything.

  <?php

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

 ?>

i want to see the reply of the server in $out after i fputs the login credentials.
i m able to view my emails from command line using openssl ,so i think the problem isnt my handling of imap .
maybe i m missing something basic about file streams .

thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

终陌 2024-12-08 08:26:19

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

fputs($sock,"a LOGIN [email protected] password\r\n");

如果您在登录命令之前使用“a”,我使用的方法可能会非常不愉快,因此将“a”更改为“1a23ef”或其他任何内容,这样在获取数据时就不会太早中断循环,还记得在每个新命令之前使用相同的键,如下所示:

fputs($sock,"a1fd20 LOGIN [email protected] password\r\n");
while(true){
 $r = fgets($sock);
  $out .= $r;
  if(strpos($r, 'a1fd20 ') === 0){
   break;
  }
}
echo $out;

这对于 FETCH 1:1 RFC822 命令效果很好,但如果要获取的消息的位置有字符串“a1fd20” 0,循环仍然会过早中断(我认为无论如何都不会发生!)。

The reason your loop is hanging is because feof never returns true since the socket is alive until the server closes the connection. If you wait long enough, eventually the loop will break with server answering "* BYE connection closed".

fputs($sock,"a LOGIN [email protected] password\r\n");

Provided you used "a" before the login command, the approach I used can be very unpleasant, so change "a" to something like "1a23ef" or anything else, so that when fetching data you won't break the loop too early, also remember to use this same key before every new command with the following:

fputs($sock,"a1fd20 LOGIN [email protected] password\r\n");
while(true){
 $r = fgets($sock);
  $out .= $r;
  if(strpos($r, 'a1fd20 ') === 0){
   break;
  }
}
echo $out;

This worked pretty well with FETCH 1:1 RFC822 command, but if the message being fetched has the string "a1fd20 " in position 0, the loop will still break too early as well (which I don't think will happen anyways!).

桃扇骨 2024-12-08 08:26:19

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

I think it's better to use standard PHP library for interaction with IMAP.
Look at http://www.php.net/manual/en/book.imap.php

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文