Christian Kruse: (POP3) Socket-Verbindungen

Hi,

jetzt werde ich euch auch mal mit einem Problem behelligen ;)

Ich möchte gern in PHP ein POP3-Modul schreiben (ja, ich weiß, es gibt bereits Funktionen dafür - aber
ich habe einfach Spaß daran ;) ).

Das Problem ist nicht, daß ich nicht wüßte wie, nein, ich habe über einen Socket eine Verbindung
zum Port 110 (POP3) aufgebaut. Jetzt sollte laut RFC 1225 (http://rfc.fh-koeln.de/rfc/html/rfc1225.html)
eine Verbindungs-Bestätigung geschickt werden - das Problem ist nur, daß sie anscheinend nicht im
Socket ankommt: das Script verfängt sich in einer Endlos-Schleife und bricht nach 30 Sek
(MaxExecutionTime) ab.

Der Quelltext sieht im Moment folgendermaßen aus:

function connect()
   {
   $txt = "";

if(($this->sock = fsockopen($this->host, $this->port, &$this->errno, &$this->errmsg, 30)))
    {

while(!feof($this->sock))
     {
     echo fgets($this->sock,1);
     flush();
     }

}
   }

Auch, wenn ich _nicht_ auf die Verbindungs-Bestätigung warte, so kommt jedoch auch keine
Bestätigungs-Meldung auf das USER-Kommando.
Auch die Verbindung wird aufgebaut:

Sep 18 20:15:01 server popper[19279]: connect from wwwrun@192.168.0.2 (192.168.0.2)

Ein Log von tcpdump ist unter http://wwwtech.de/txt/log.txt verfügbar: es ist zu sehen, daß
durchaus Pakete zurück geschickt werden - nur anscheinend können sie nicht ausgelesen werden.

Das seltsame ist, daß ein einfacher GET an den Apache durchaus funktioniert; die Bestätigungen
des POP-Servers selber werden auch brav ausgespuckt, wenn ich das ganze über telnet ausprobiere.

Weiß einer vielleicht, woran das liegen könnte?

mfg
CK1

  1. Ich möchte gern in PHP ein POP3-Modul schreiben (ja, ich weiß, es gibt bereits Funktionen dafür - aber
    ich habe einfach Spaß daran ;) ).

    Es gibt von Sebastian Bergmann et al. auch schon PHP basierende Module dafür.

    Das Problem ist nicht, daß ich nicht wüßte wie, nein, ich habe über einen Socket eine Verbindung
    zum Port 110 (POP3) aufgebaut. Jetzt sollte laut RFC 1225 (http://rfc.fh-koeln.de/rfc/html/rfc1225.html)

    http://www.ietf.org/rfc/rfc1725.txt

    <?
    $sock = fsockopen("pop.gmx.net", 110);
    print fgets($sock, 32768);

    ^Z
    X-Powered-By: PHP/4.0.2
    Content-type: text/html

    +OK GMX POP3 StreamProxy v1.1 ready.

    echo fgets($this->sock,1);

    Du liesst maximal 1 Zeichen ein, das ist ein wenig wenig. Im übrigen solltest du prüfen, ob dein fsockopen() überhaupt erfolgreich war.

    1. Hi,

      Es gibt von Sebastian Bergmann et al. auch schon PHP basierende Module dafür.

      ich habe aber Spaß daran, es selber zu machen ;)

      http://www.ietf.org/rfc/rfc1725.txt

      Thx - die RFC hat mir ziehmlich weiter geholfen: es wird kein EOF sondern LFCR gesendet.

      Du liesst maximal 1 Zeichen ein, das ist ein wenig wenig.

      Nein: ich lese solange ein Zeichen (eher ein Byte) ein, bis EOF kommt, bzw jetzt LFCR ;)

      Im übrigen solltest du prüfen, ob dein fsockopen() überhaupt erfolgreich war.

      Der war erfolgreich: die Verbindung kommt zustande.

      besten Dank
      CK1