3

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の処理ではないと思います。たぶん、ファイルストリームに関する基本的なことを見逃しているかもしれません。

ありがとう。

4

2 に答える 2

0

ループがハングする理由は、サーバーが接続を閉じるまでソケットが有効であるため、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 " が含まれている場合でも、ループがあまりにも早く壊れます (いずれにせよ起こるとは思いません!)。

于 2014-02-20T12:48:40.940 に答える
-1

IMAPとの対話には標準のPHPライブラリを使用する方が良いと思います。http://www.php.net/manual/en/book.imap.phpを見てください

于 2011-08-25T19:39:53.213 に答える