class POP3
{
public $host = '192.168.1.1';
public $port = 110;
public $timeout = 10;
public $error = null;
private $fd = null;
public function __construct()
{
$this->fd = fsockopen($this->host,$this->port,&$errno,&$errstr,$this->timeout);
stream_set_blocking($this->fd,true);
if( $errno )
{
echo 'Error: '.$errno.': '.$errstr;
exit(1);
}
$msg = $this->_read();
if( ! $this->_check($msg) )
{
$this->error = $msg;
$this->_write('QUIT');
}
}
private function _write($cmd)
{
fwrite($this->fd,$cmd."\r\n");
}
private function _read($stream=false)
{
$retval = null;
if( ! $stream )
{
$retval = fgets($this->fd,1024);
//$retval = preg_replace("/\r?\n/","\r\n",$retval);
} else {
while( ! feof($this->fd) )
{
$tmp = fgets($this->fd,1024);
//$tmp = preg_replace("/\r?\n/","\r\n",$tmp);
if( chop($tmp) == '.') break;
$retval .= $tmp;
}
}
return $retval;
}
private function _check($msg)
{
$stat = substr($msg,0,strpos($msg,' '));
if($stat == '-ERR') return false;
//if($stat == '+OK') return true;
return true;
}
//login to server
public function pUSERPASS($user, $password)
{
$this->_write('USER '.$user);
$msg = $this->_read();
if( ! $this->_check($msg) )
{
$this->error = $msg;
$this->_write('QUIT');
return false;
}
$this->_write('PASS '.$password);
$msg = $this->_read();
if( ! $this->_check($msg) )
{
$this->error = $msg;
$this->_write('QUIT');
return false;
}
return true;
}
public function pSTAT()
{
$retval = null;
$this->_write('STAT');
$msg = $this->_read();
if( ! $this->_check($msg) )
{
$this->error = $msg;
$this->_write('QUIT');
return false;
}
list(,$retval['number'],$retval['size']) = split(' ',$msg);
return $retval;
}
//list messages on server
public function pLIST()
{
$this->_write('LIST');
$msg = $this->_read();
if( ! $this->_check($msg) )
{
$this->error = $msg;
$this->_write('QUIT');
return false;
}
$msg = split("\n",$this->_read(true));
for($x = 0; $x < sizeof($msg); $x++ )
{
$tmp = split(' ',$msg[$x]);
$retval[$tmp[0]] = $tmp[1];
}
unset($retval['']);
return $retval;
}
//retrive a message from server
public function pRETR($num)
{
$this->_write('RETR '.$num);
$msg = $this->_read();
if( ! $this->_check($msg) )
{
$this->error = $msg;
$this->_write('QUIT');
return false;
}
$msg = $this->_read(true);
return $msg;
}
//marks a message deletion from the server
//it is not actually deleted until the QUIT command is issued.
//If you lose the connection to the mail server before issuing
//the QUIT command, the server should not delete any messages
public function pDELE($num)
{
$this->_write('DELE '.$num);
$msg = $this->_read();
if( ! $this->_check($msg) )
{
$this->error = $msg;
$this->_write('QUIT');
return false;
}
}
//This resets (unmarks) any messages previously marked for deletion in this session
//so that the QUIT command will not delete them
public function pRSET()
{
$this->_write('RSET');
$msg = $this->_read();
if( ! $this->_check($msg) )
{
$this->error = $msg;
return false;
}
}
//This deletes any messages marked for deletion, and then logs you off of the mail server.
//This is the last command to use. This does not disconnect you from the ISP, just the mailbox.
public function pQUIT()
{
$this->_write('QUIT');
$msg = $this->_read();
if( ! $this->_check($msg) )
{
$this->error = $msg;
return false;
}
}
public function __destruct()
{
fclose($this->fd);
}
}
//EXAMPLE:
$pop3 = new POP3();
$pop3->pUSERPASS('tieto','123456');
if($pop3->error){echo 'ERROR: '.$pop3->error; exit(0); }
$messages = $pop3->pLIST();
echo $pop3->pRETR(1);
$pop3->pQUIT();
|