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