проблема связи с сервером IMAP Gmail с помощью fsockopen в PHP - PullRequest
3 голосов
/ 25 августа 2011

я могу общаться, используя функции imap в php, а также используя openssl из командной строки, я просто хотел попробовать это с помощью fsockopen () в php.мой код:

<?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 

и когда я изменяю код с помощью цикла while для fgets,он продолжает загружаться и в конце времени ничего не показывает.

  <?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.может быть, я упускаю что-то базовое в файловых потоках.

спасибо.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2014

Причина, по которой ваш цикл зависает, заключается в том, что 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, но если в извлекаемом сообщении строка «a1fd20» находится в позиции 0, цикл все равно будет слишком рано прерываться (что, я думаю, не произойдет в любом случае !).

0 голосов
/ 25 августа 2011

Я думаю, что лучше использовать стандартную библиотеку PHP для взаимодействия с IMAP.Посмотрите на http://www.php.net/manual/en/book.imap.php

...