• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

fsockopen + feof = endlosschleife

Status
Für weitere Antworten geschlossen.

Frank

Neues Mitglied
Hi Community

Ich versuche mittels eines PHP Scriptes und der funktion fsockopen auf mein/ein pop3-Konto zuzugreifen.

Das Klappt auch wunderbar und ich kann mich mittels fputs() einloggen.

Wenn ich jetzt die Mails mittels dem Befehl "LIST" abfrage bekomme ich aber eine unbestimmte menge an zeilen wieder (jenachdem wieviel Emails da sind).

Um alles auszulesen und nix übrig zu lassen muss ich daher die Datei bis zum ende auslesen.

Hab dann angefangen zu googlen, und siehe da, ich habe die nette Funktion feof() gefunden.

Leider entsteht dann aber eine Endlosschleife die nach 30 S abbricht ( Max. Time Exceeded Error ... ).

Hab bis jetzt leider nicht gefunden, wie ich dass realisieren Kann.

Mein jetziges Script
PHP:
<?php
$mails = fsockopen("*******", 110, $e, $en, 5);
fputs($mails,"USER ****@*******.**\n\r");
fgets($mails,4096);
fgets($mails,4096);
fputs($mails,"PASS ***********\n\r");
fgets($mails,4096);
fgets($mails,4096);
fputs($mails,"LIST\n\r");
fgets($mails,4096);
while (! feof($mails)) {

   $line[] = fgets($mails);
}
var_dump($line);
fclose($mails);
?>

Vielen Dank im Voraus
 
Falsche Lösung.

LIST gibt die Liste der Einträge zurück. Beendet wird die Liste mit eine Zeile ".". Z.B.:
Code:
LIST
+OK POP3 clients that break here, they violate STD53.
1 4870
2 56608
3 5364
4 16326
5 14394
6 5605
7 13847
8 1485
9 14067
10 3813
11 16524
12 3998
13 8235
14 6642
15 10000
16 18128
17 6703
18 18422
19 4465
20 25273
21 63064
22 4450
23 18120
24 16282
25 22805
.

Lies Dir mal die RFC zum POP-Protokoll :-)

Gruß,
Jumper, the II.
 
Ja dass weiß ich ja xD

Aber wie bekomme ich die Komplette Liste abgefragt, wenn es mit feof() nicht funktioniert...

hab dass jetzt mal so versucht, hat aber auch net funzt
PHP:
$run = true;
while($run)
{
   $check = fgets($mails);
   $line[] = $check;
   if(preg_match("%\.%isU",$check))
   {
     $run = false;
     break;
   }
}
 
Ich hab mal exceed-limit auf 5 Minuten gesetzt, bei meinem Code
PHP:
$run = true; 
while($run) 
{ 
   $check = fgets($mails); 
   $line[] = $check; 
   if(preg_match("%\.%isU",$check)) 
   { 
     $run = false; 
     break; 
   } 
}
bekomme ich die gewünschte Ausgabe, aber erst nach 3 Minuten ladezeit

@Prophet

hab auch deinen Code ausprobiert, aber der ergibt ne komplette Endlossleife und da reichen nichtmal die 5 Min aus zum ausführen
 
Dann versuche bitte nochmal folgendes:
PHP:
while(($check = fgets($mails)){0} != '.')
{
   $line[] = $check;
}
 
An die möglichkeiten von C++ kommt die Syntax von PHP wohl nicht ran. Naja, so wird es winigstens lesbarer:
PHP:
while(true)
{
  $check = fgets($mails);
  if($check{0} != '.')
  {
    $line[] = $check;
  }
  else
  {
    break;
  }
}
 
Ja dein Code funktioniert jetzt

Vielen Dank!

Zwar ist die Ladezeit immernoch enorm, aber damit werde ich mich wohl zufrieden geben müssen.

Ich danke dir auf jeden Fall schoneinmal
 
Eine Andere Variante, die auch noch einige weitere Probleme entsorgt:
PHP:
<?php 

$mail = FALSE;

do {

  $mails = fsockopen("*****", 110, $e, $en, 5); 
  $r = fgets($mails);
  if( strlen( $r) < 3 | substr( $r, 0, 3) != "+OK") {
    // Error ... kann keine Verbindung aufnehmen
    print( "Error: " . substr( $r, 4) . " ...\n");
    break;
  }
  
  fputs($mails,"USER *****@*****\n\r"); 
  $r = fgets($mails);
  if( strlen( $r) < 3 | substr( $r, 0, 3) != "+OK") {
    // Error ... User kann nicht gesetzt werden
    print( "Error: " . substr( $r, 4) . " ...\n");
    break;
  }

  fputs($mails,"PASS *****\n\r"); 
  $r = fgets($mails);
  if( strlen( $r) < 3 | substr( $r, 0, 3) != "+OK") {
    // Error ... Password kann nicht gesetzt werden
    print( "Error: " . substr( $r, 4) . " ...\n");
    break;
  }

  fputs($mails,"LIST\n\r"); 
  $r = fgets($mails);
  if( strlen( $r) < 3 | substr( $r, 0, 3) != "+OK") {
    // Error ... Liste kann nicht abgefragt werden
    print( "Error: " . substr( $r, 4) . " ...\n");
    break;
  }


  while ( substr($line1 = fgets( $mails), 0, 1) != ".") { 

    $line[] = substr( $line1, 0, strlen( $line1) -2);

  }

  fputs( $mails, "QUIT\n\r");
  $r = fgets($mails);
  if( strlen( $r) < 3 | substr( $r, 0, 3) != "+OK") {
    // Error ... POP kann nicht beendet werden
    print( "Error: " . substr( $r, 4) . " ...\n");
    break;
  }

  var_dump($line); 

} while( false);


if( $mails !== FALSE)  {
  fclose($mails);
  $mails = FALSE;
}

?>

Laut RFC sind die Rückgabewerte mit einem Status +OK oder -ERR garniert. Darüber hinaus umfasst die Funktion fgets grundsätzlich auch die Zeilenvorschübe ...

Gruß,
Jumper, the II.
 
:D vielen Dank, dass funktioniert jetzt problemlos (und vorallem schnell)

thx - *zufrieden ans weiterarbeiten mach*
 
@JumperII: Was mache ich anders als du? Also warum ist dein code schneller als meiner. Ich verstehe das nicht. Eigentlich mache ich doch nichts anderes.
 
@JumperII: Was mache ich anders als du? Also warum ist dein code schneller als meiner. Ich verstehe das nicht. Eigentlich mache ich doch nichts anderes.

Naja, ich hatte die zugehörige RFC gelesen und mit telnet etwas gespielt. RFC lesen gehört dazu. Ich nehme an, das Frank es trotzdem nicht richtig verstanden hat.

Was ist anders? Zum einen habe ich nur eine Zeile nach der Übergabe eines Kommandos ausgelesen und den dann zwanghaft erscheinenden Status (+OK oder -ERR) ausgewertet. Darüber hinaus warte ich nach dem Auslesen der Liste (Finish mit dem ".") nicht auf den Timeout sondern gehe gleich mit QUIT aus der Verbindung ;-) Das Pop3 Protokoll halt .... lesen bildet ... telnet überprüft .... :mrgreen:

Gruß,
Jumper, the II.

PS: Die RFC ist 1939 ... kann unter http://www.rfc-archive.org/ nachgelesen werden.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben