使用PHP的Socket写的POP3类
查看 POP3/SMTP 协议的时候想尝试一下自己写一个操作类,核心没啥,就是使用 fsockopen ,然后写入/接收数据,只实现了最核心的部分功能,当作是学习 Socket 操作的练手。其中参考了 RFC 2449和一个国外的简单Web邮件系统 Uebimiau 的部分代码,不过绝对没有抄他滴,HOHO,绝对原创。如果你喜欢,请收藏,随便修改,嗯,但是记得不要删除偶类里的声名,毕竟偶也是辛辛苦苦写了好几天呐。
另外,欢迎自由发挥,改善或者修正这个类,希望能够为你所用。代码没有认真仔细的调试,发现bug请自己修正,HOHO!
<?php
/**
*类名:SocketPOPClient
*功能:POP3协议客户端的基本操作类
*作者:heiyeluren<http://blog.csdn.net/heiyeshuwu>
*时间:2006-7-3
*参考:RFC2449,Uebimiau
*授权:BSDLicense
*/
classSocketPOPClient
{
var$strMessage='';
var$intErrorNum=0;
var$bolDebug=false;
var$strEmail='';
var$strPasswd='';
var$strHost='';
var$intPort=110;
var$intConnSecond=30;
var$intBuffSize=8192;
var$resHandler=NULL;
var$bolIsLogin=false;
var$strRequest='';
var$strResponse='';
var$arrRequest=array();
var$arrResponse=array();
//---------------
//基础操作
//---------------
//构造函数
functionSocketPOP3Client($strLoginEmail,$strLoginPasswd,$strPopHost='',$intPort='')
{
$this->strEmail=trim(strtolower($strLoginEmail));
$this->strPasswd=trim($strLoginPasswd);
$this->strHost=trim(strtolower($strPopHost));
if($this->strEmail==''||$this->strPasswd=='')
{
$this->setMessage('EmailaddressorPasswdisempty',1001);
returnfalse;
}
if(!preg_match("/^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$/i",$this->strEmail))
{
$this->setMessage('Emailaddressinvalid',1002);
returnfalse;
}
if($this->strHost=='')
{
$this->strHost=substr(strrchr($this->strEmail,"@"),1);
}
if($intPort!='')
{
$this->intPort=$intPort;
}
$this->connectHost();
}
//连接服务器
functionconnectHost()
{
if($this->bolDebug)
{
echo"Connection".$this->strHost.".../r/n";
}
if(!$this->getIsConnect())
{
if($this->strHost==''||$this->intPort=='')
{
$this->setMessage('POP3hostorPortisempty',1003);
returnfalse;
}
$this->resHandler=@fsockopen($this->strHost,$this->intPort,&$this->intErrorNum,&$this->strMessage,$this->intConnSecond);
if(!$this->resHandler)
{
$strErrMsg='ConnectionPOP3host:'.$this->strHost.'failed';
$intErrNum=2001;
$this->setMessage($strErrMsg,$intErrNum);
returnfalse;
}
$this->getLineResponse();
if(!$this->getRestIsSucceed())
{
returnfalse;
}
}
returntrue;
}
//关闭连接
functioncloseHost()
{
if($this->resHandler)
{
fclose($this->resHandler);
}
returntrue;
}
//发送指令
functionsendCommand($strCommand)
{
if($this->bolDebug)
{
if(!preg_match("/PASS/",$strCommand))
{
echo"SendCommand:".$strCommand."/r/n";
}
else
{
echo"SendCommand:PASS******/r/n";
}
}
if(!$this->getIsConnect())
{
returnfalse;
}
if(trim($strCommand)=='')
{
$this->setMessage('Requestcommandisempty',1004);
returnfalse;
}
$this->strRequest=$strCommand."/r/n";
$this->arrRequest[]=$strCommand;
fputs($this->resHandler,$this->strRequest);
returntrue;
}
//提取响应信息第一行
functiongetLineResponse()
{
if(!$this->getIsConnect())
{
returnfalse;
}
$this->strResponse=fgets($this->resHandler,$this->intBuffSize);
$this->arrResponse[]=$this->strResponse;
return$this->strResponse;
}
//提取若干响应信息,$intReturnType是返回值类型,1为字符串,2为数组
functiongetRespMessage($intReturnType)
{
if(!$this->getIsConnect())
{
returnfalse;
}
if($intReturnType==1)
{
$strAllResponse='';
while(!feof($this->resHandler))
{
$strLineResponse=$this->getLineResponse();
if(preg_match("/^/+OK/",$strLineResponse))
{
continue;
}
if(trim($strLineResponse)=='.')
{
break;
}
$strAllResponse.=$strLineResponse;
}
return$strAllResponse;
}
else
{
$arrAllResponse=array();
while(!feof($this->resHandler))
{
$strLineResponse=$this->getLineResponse();
if(preg_match("/^/+OK/",$strLineResponse))
{
continue;
}
if(trim($strLineResponse)=='.')
{
break;
}
$arrAllResponse[]=$strLineResponse;
}
return$arrAllResponse;
}
}
//提取请求是否成功
functiongetRestIsSucceed($strRespMessage='')
{
if(trim($responseMessage)=='')
{
if($this->strResponse=='')
{
$this->getLineResponse();
}
$strRespMessage=$this->strResponse;
}
if(trim($strRespMessage)=='')
{
$this->setMessage('Responsemessageisempty',2003);
returnfalse;
}
if(!preg_match("/^/+OK/",$strRespMessage))
{
$this->setMessage($strRespMessage,2000);
returnfalse;
}
returntrue;
}
//获取是否已连接
functiongetIsConnect()
{
if(!$this->resHandler)
{
$this->setMessage("Nonexistentavailabilityconnectionhandler",2002);
returnfalse;
}
returntrue;
}
//设置消息
functionsetMessage($strMessage,$intErrorNum)
{
if(trim($strMessage)==''||$intErrorNum=='')
{
returnfalse;
}
$this->strMessage=$strMessage;
$this->intErrorNum=$intErrorNum;
returntrue;
}
//获取消息
functiongetMessage()
{
return$this->strMessage;
}
//获取错误号
functiongetErrorNum()
{
return$this->intErrorNum;
}
//获取请求信息
functiongetRequest()
{
return$this->strRequest;
}
//获取响应信息
functiongetResponse()
{
return$this->strResponse;
}
//---------------
//邮件原子操作
//---------------
//登录邮箱
functionpopLogin()
{
if(!$this->getIsConnect())
{
returnfalse;
}
$this->sendCommand("USER".$this->strEmail);
$this->getLineResponse();
$bolUserRight=$this->getRestIsSucceed();
$this->sendCommand("PASS".$this->strPasswd);
$this->getLineResponse();
$bolPassRight=$this->getRestIsSucceed();
if(!$bolUserRight||!$bolPassRight)
{
$this->setMessage($this->strResponse,2004);
returnfalse;
}
$this->bolIsLogin=true;
returntrue;
}
//退出登录
functionpopLogout()
{
if(!$this->getIsConnect()&&$this->bolIsLogin)
{
returnfalse;
}
$this->sendCommand("QUIT");
$this->getLineResponse();
if(!$this->getRestIsSucceed())
{
returnfalse;
}
returntrue;
}
//获取是否在线
functiongetIsOnline()
{
if(!$this->getIsConnect()&&$this->bolIsLogin)
{
returnfalse;
}
$this->sendCommand("NOOP");
$this->getLineResponse();
if(!$this->getRestIsSucceed())
{
returnfalse;
}
returntrue;
}
//获取邮件数量和字节数(返回数组)
functiongetMailSum($intReturnType=2)
{
if(!$this->getIsConnect()&&$this->bolIsLogin)
{
returnfalse;
}
$this->sendCommand("STAT");
$strLineResponse=$this->getLineResponse();
if(!$this->getRestIsSucceed())
{
returnfalse;
}
if($intReturnType==1)
{
return$this->strResponse;
}
else
{
$arrResponse=explode("",$this->strResponse);
if(!is_array($arrResponse)||count($arrResponse)<=0)
{
$this->setMessage('STATcommandresponsemessageiserror',2006);
returnfalse;
}
returnarray($arrResponse[1],$arrResponse[2]);
}
}
//获取指定邮件得SessionId
functiongetMailSessId($intMailId,$intReturnType=2)
{
if(!$this->getIsConnect()&&$this->bolIsLogin)
{
returnfalse;
}
if(!$intMailId=intval($intMailId))
{
$this->setMessage('Mailmessageidinvalid',1005);
returnfalse;
}
$this->sendCommand("UIDL".$intMailId);
$this->getLineResponse();
if(!$this->getRestIsSucceed())
{
returnfalse;
}
if($intReturnType==1)
{
return$this->strResponse;
}
else
{
$arrResponse=explode("",$this->strResponse);
if(!is_array($arrResponse)||count($arrResponse)<=0)
{
$this->setMessage('UIDLcommandresponsemessageiserror',2006);
returnfalse;
}
returnarray($arrResponse[1],$arrResponse[2]);
}
}
//取得某个邮件的大小
functiongetMailSize($intMailId,$intReturnType=2)
{
if(!$this->getIsConnect()&&$this->bolIsLogin)
{
returnfalse;
}
$this->sendCommand("LIST".$intMailId);
$this->getLineResponse();
if(!$this->getRestIsSucceed())
{
returnfalse;
}
if($intReturnType==1)
{
return$this->strResponse;
}
else
{
$arrMessage=explode('',$this->strResponse);
returnarray($arrMessage[1],$arrMessage[2]);
}
}
//获取邮件基本列表数组
functiongetMailBaseList($intReturnType=2)
{
if(!$this->getIsConnect()&&$this->bolIsLogin)
{
returnfalse;
}
$this->sendCommand("LIST");
$this->getLineResponse();
if(!$this->getRestIsSucceed())
{
returnfalse;
}
return$this->getRespMessage($intReturnType);
}
//获取指定邮件所有信息,intReturnType是返回值类型,1是字符串,2是数组
functiongetMailMessage($intMailId,$intReturnType=1)
{
if(!$this->getIsConnect()&&$this->bolIsLogin)
{
returnfalse;
}
if(!$intMailId=intval($intMailId))
{
$this->setMessage('Mailmessageidinvalid',1005);
returnfalse;
}
$this->sendCommand("RETR".$intMailId);
$this->getLineResponse();
if(!$this->getRestIsSucceed())
{
returnfalse;
}
return$this->getRespMessage($intReturnType);
}
//获取某邮件前指定行,$intReturnType返回值类型,1是字符串,2是数组
functiongetMailTopMessage($intMailId,$intTopLines=10,$intReturnType=1)
{
if(!$this->getIsConnect()&&$this->bolIsLogin)
{
returnfalse;
}
if(!$intMailId=intval($intMailId)||!$intTopLines=int($intTopLines))
{
$this->setMessage('MailmessageidorToplinesnumberinvalid',1005);
returnfalse;
}
$this->sendCommand("TOP".$intMailId."".$intTopLines);
$this->getLineResponse();
if(!$this->getRestIsSucceed())
{
returnfalse;
}
return$this->getRespMessage($intReturnType);
}
//删除邮件
functiondelMail($intMailId)
{
if(!$this->getIsConnect()&&$this->bolIsLogin)
{
returnfalse;
}
if(!$intMailId=intval($intMailId))
{
$this->setMessage('Mailmessageidinvalid',1005);
returnfalse;
}
$this->sendCommand("DELE".$intMailId);
$this->getLineResponse();
if(!$this->getRestIsSucceed())
{
returnfalse;
}
returntrue;
}
//重置被删除得邮件标记为未删除
functionresetDeleMail()
{
if(!$this->getIsConnect()&&$this->bolIsLogin)
{
returnfalse;
}
$this->sendCommand("RSET");
$this->getLineResponse();
if(!$this->getRestIsSucceed())
{
returnfalse;
}
returntrue;
}
//---------------
//调试操作
//---------------
//输出对象信息
functionprintObject()
{
print_r($this);
exit;
}
//输出错误信息
functionprintError()
{
echo"[ErrorMsg]:$strMessage<br>/n";
echo"[ErrorNum]:$intErrorNum<br>/n";
exit;
}
//输出主机信息
functionprintHost()
{
echo"[Host]:$this->strHost<br>/n";
echo"[Port]:$this->intPort<br>/n";
echo"[Email]:$this->strEmail<br>/n";
echo"[Passwd]:********<br>/n";
exit;
}
//输出连接信息
functionprintConnect()
{
echo"[Connect]:$this->resHandler<br>/n";
echo"[Request]:$this->strRequest<br>/n";
echo"[Response]:$this->strResponse<br>/n";
exit;
}
}
?>
<?
//测试代码
//例如:$o=SocketPOP3Client('邮箱地址','密码','POP3服务器','POP3端口')
/*
set_time_limit(0);
$o=newSocketPOPClient('[email protected]','123456','pop.126.com','110');
$o->popLogin();
print_r($o->getMailBaseList());
print_r($o->getMailSum(1));
print_r($o->getMailTopMessage(2,2,2));
$o->popLogout();
$o->closeHost();
$o->printObject();
*/
?>