// // smtp_listener.php : explicit // //VGR18012006 Création //VGR20012006 MOD to reply "250 OK" all the time as per RFC http://www.ietf.org/rfc/rfc0821.txt // MOD all error handling for socket_* functions, "<0" is wrong, "===FALSE" is right // // TODO : Nil // //error_reporting(E_ALL); //set_time_limit(0); //ob_implicit_flush(); $address = '127.0.0.1'; $port = 25; $eoln="\r\n"; echo "socket_create...{$eoln}"; ob_flush(); flush(); sleep(1); if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP))===FALSE) { // boolean echo "socket_create() failed : reason : " . socket_strerror($sock).$eoln; exit; } echo "socket_create OK{$eoln}"; ob_flush(); flush(); sleep(1); if (!($ret=socket_bind($sock, $address, $port))) { // boolean echo "socket_bind() failed : reason : " . socket_strerror($ret).$eoln; exit; } echo "socket_bind OK{$eoln}"; ob_flush(); flush(); sleep(1); if (!($ret=socket_listen($sock,5))) { // boolean echo "socket_listen() failed : reason : " . socket_strerror($ret).$eoln; exit; } if (!socket_set_nonblock($sock)) { // boolean echo "socket_set_nonblock() failed : reason : " . socket_strerror($ret).$eoln; exit; } echo "socket_listen OK{$eoln}"; ob_flush(); flush(); sleep(1); do { if (($msgsock=socket_accept($sock))===FALSE) { //VGR REM this is a blocking socket echo "socket_accept() failed : reason : " . socket_strerror($msgsock).$eoln; ob_flush(); flush(); sleep(1); break; } else echo "socket_accept OK{$eoln}"; ob_flush(); flush(); sleep(1); /* Send ACK. */ $msg = "220 VGRTEST Simple Mail Transfer Service Ready\n"; socket_write($msgsock, $msg, strlen($msg)); echo "ACKed with '$msg'{$eoln}"; ob_flush(); flush(); sleep(1); do { if (FALSE === ($buf = @socket_read($msgsock, 2048, PHP_NORMAL_READ))) { //VGR REM , PHP_NORMAL_READ echo "socket_read() failed : reason : " . socket_strerror($ret).$eoln; ob_flush(); flush(); sleep(1); break 2; } else echo "socket_read '$buf' OK{$eoln}"; ob_flush(); flush(); sleep(1); if (!$buf = trim($buf)) { continue; } $bufs=explode($buf,' '); if ($buf=="\r\n\r\n") { //VGR REM end of transmission of DATA segment socket_close($msgsock); echo "EOLN{$eoln}"; ob_flush(); flush(); sleep(1); break 2; } elseif ($bufs[0]=='HELO') { $talkback="250 VGRTEST\n"; } elseif ($bufs[0]=='QUIT') { $talkback="221 VGRTEST Service closing transmission channel\n"; } elseif ($bufs[0]=='DATA') { $talkback="354 send the mail data, end with .\n"; } else $talkback="250 OK\n"; socket_write($msgsock, $talkback, strlen($talkback)); echo "$buf{$eoln}"; ob_flush(); flush(); sleep(1); } while (true); socket_close($msgsock); } while (true); socket_close($sock);