gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:25:58 25 4
gpt4 key购买 nike

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

谢谢。

最佳答案

挂起循环的原因是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”,则循环也将中断得太早(我认为无论如何都不会发生!)。

关于php - 在PHP中使用fsockopen与gmail imap服务器通信时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7196142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com