test_pop3.php
<HTML> <HEAD> <TITLE>Test for Manuel Lemos's PHP POP3 class</TITLE> </HEAD> <BODY> <? require("pop3.php");
$user="user"; $password="passwd"; $apop=0; $pop3_connection=new pop3_class; $pop3_connection->hostname="mail.xiaocui.com"; if(($error=$pop3_connection->Open())=="") { echo "<PRE>Connected to the POP3 server "$pop3_connection->hostname".</PRE> "; if(($error=$pop3_connection->Login($user,$password,$apop))=="") { echo "<PRE>User "$user" logged in.</PRE> "; if(($error=$pop3_connection->Statistics(&$messages,&$size))=="") { echo "<PRE>There are <b>$messages</b> messages in the mail box with a total of <b>$size</b> bytes.</PRE> "; $result=$pop3_connection->ListMessages("",0); if(GetType($result)=="array") { for(Reset($result),$message=0;$message<count($result);Next($result),$message++) echo "<PRE>Message ",Key($result)," - ",$result[Key($result)]," bytes.</PRE> "; if($messages>0) { if(($error=$pop3_connection->RetrieveMessage(1,&$headers,&$body,-1))=="") { echo "<PRE>Message 1: ---Message headers starts below---</PRE> "; for($line=0;$line<count($headers);$line++) echo "<PRE>",HtmlSpecialChars($headers[$line]),"</PRE> "; echo "<PRE>---Message headers ends above--- ---Message body starts below---</PRE> "; for($line=0;$line<count($body);$line++) echo "<PRE>",HtmlSpecialChars($body[$line]),"</PRE> "; echo "<PRE>---Message body ends above---</PRE> "; } } if($error==""&&($error=$pop3_connection->Close())=="") echo "<PRE>Disconnected from the POP3 server "$pop3_connection->hostname".</PRE> "; } else $error=$result; } } } if($error!="") echo "<H2>Error: ",HtmlSpecialChars($error),"</H2>"; ?> </BODY> </HTML>
pop3.php
<?
class pop3_class { var $hostname=""; var $port=110;
var $connection=0; var $state="DISCONNECTED"; var $greeting=""; var $must_update=0; var $debug=0;
Function OutputDebug($message) { echo $message,"<br> "; }
Function GetLine() { for($line="";;) { if(feof($this->connection)) return(0); $line.=fgets($this->connection,100); $length=strlen($line); if($length>=2 && substr($line,$length-2,2)==" ") { $line=substr($line,0,$length-2); if($this->debug) $this->OutputDebug("< $line"); return($line); } } }
Function PutLine($line) { if($this->debug) $this->OutputDebug("> $line"); return(fputs($this->connection,"$line ")); }
Function OpenConnection() { if($this->hostname=="") return("2 it was not specified a valid hostname"); switch(($this->connection=fsockopen($this->hostname,$this->port))) { case -3: return("-3 socket could not be created"); case -4: return("-4 dns lookup on hostname "$hostname" failed"); case -5: return("-5 connection refused or timed out"); case -6: return("-6 fdopen() call failed"); case -7: return("-7 setvbuf() call failed"); default: return(""); } }
Function CloseConnection() { if($this->connection!=0) { fclose($this->connection); $this->connection=0; } }
Function Open() { if($this->state!="DISCONNECTED") return("1 a connection is already opened"); if(($error=$this->OpenConnection())!="") return($error); $this->greeting=$this->GetLine(); if(GetType($this->greeting)!="string" || strtok($this->greeting," ")!="+OK") { $this->CloseConnection(); return("3 POP3 server greeting was not found"); } $this->greeting=strtok(" "); $this->must_update=0; $this->state="AUTHORIZATION"; return(""); } Function Close() { if($this->state=="DISCONNECTED") return("no connection was opened"); if($this->must_update) { if($this->PutLine("QUIT")==0) return("Could not send the QUIT command"); $response=$this->GetLine(); if(GetType($response)!="string") return("Could not get quit command response"); if(strtok($response," ")!="+OK") return("Could not quit the connection: ".strtok(" ")); } $this->CloseConnection(); $this->state="DISCONNECTED"; return(""); }
Function Login($user,$password,$apop) { if($this->state!="AUTHORIZATION") return("connection is not in AUTHORIZATION state"); if($apop) { if($this->PutLine("APOP $user ".md5($this->greeting.$password))==0) return("Could not send the APOP command"); $response=$this->GetLine(); if(GetType($response)!="string") return("Could not get APOP login command response"); if(strtok($response," ")!="+OK") return("APOP login failed: ".strtok(" ")); } else { if($this->PutLine("USER $user")==0) return("Could not send the USER command"); $response=$this->GetLine(); if(GetType($response)!="string") return("Could not get user login entry response"); if(strtok($response," ")!="+OK") return("User error: ".strtok(" ")); if($this->PutLine("PASS $password")==0) return("Could not send the PASS command"); $response=$this->GetLine(); if(GetType($response)!="string") return("Could not get login password entry response"); if(strtok($response," ")!="+OK") return("Password error: ".strtok(" ")); } $this->state="TRANSACTION"; return(""); }
/* Statistics method - pass references to variables to hold the number of messages in the mail box and the size that they take in bytes. */
Function Statistics($messages,$size) { if($this->state!="TRANSACTION") return("connection is not in TRANSACTION state"); if($this->PutLine("STAT")==0) return("Could not send the STAT command"); $response=$this->GetLine(); if(GetType($response)!="string") return("Could not get the statistics command response"); if(strtok($response," ")!="+OK") return("Could not get the statistics: ".strtok(" ")); $messages=strtok(" "); $size=strtok(" "); return(""); }
Function ListMessages($message,$unique_id) { if($this->state!="TRANSACTION") return("connection is not in TRANSACTION state"); if($unique_id) $list_command="UIDL"; else $list_command="LIST"; if($this->PutLine("$list_command $message")==0) return("Could not send the $list_command command"); $response=$this->GetLine(); if(GetType($response)!="string") return("Could not get message list command response"); if(strtok($response," ")!="+OK") return("Could not get the message listing: ".strtok(" ")); if($message=="") { for($messages=array();;) { $response=$this->GetLine(); if(GetType($response)!="string") return("Could not get message list response"); if($response==".") break; $message=intval(strtok($response," ")); if($unique_id) $messages[$message]=strtok(" "); else $messages[$message]=intval(strtok(" ")); } return($messages); } else { $message=intval(strtok(" ")); return(intval(strtok(" "))); } }
Function RetrieveMessage($message,$headers,$body,$lines) { if($this->state!="TRANSACTION") return("connection is not in TRANSACTION state"); if($lines<0) { $command="RETR"; $arguments="$message"; } else { $command="TOP"; $arguments="$message $lines"; } if($this->PutLine("$command $arguments")==0) return("Could not send the $command command"); $response=$this->GetLine(); if(GetType($response)!="string") return("Could not get message retrieval command response"); if(strtok($response," ")!="+OK") return("Could not retrieve the message: ".strtok(" ")); for($headers=$body=array(),$line=0;;$line++) { $response=$this->GetLine(); if(GetType($response)!="string") return("Could not retrieve the message"); switch($response) { case ".": return(""); case "": break 2; default: if(substr($response,0,1)==".") $response=substr($response,1,strlen($response)-1); break; } $headers[$line]=$response; } for($line=0;;$line++) { $response=$this->GetLine(); if(GetType($response)!="string") return("Could not retrieve the message"); switch($response) { case ".": return(""); default: if(substr($response,0,1)==".") $response=substr($response,1,strlen($response)-1); break; } $body[$line]=$response; } return(""); }
};
?>
| |