使用PHP写的POP3操作类



使用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);
return
false;
}
if(!
preg_match("/^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$/i",$this->strEmail))
{
$this->setMessage('Emailaddressinvalid',1002);
return
false;
}
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);
return
false;
}
$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);
return
false;
}
$this->getLineResponse();
if(!
$this->getRestIsSucceed())
{
return
false;
}
}
return
true;
}

//关闭连接
functioncloseHost()
{
if(
$this->resHandler)
{
fclose($this->resHandler);
}
return
true;
}

//发送指令
functionsendCommand($strCommand)
{
if(
$this->bolDebug)
{
if(!
preg_match("/PASS/",$strCommand))
{
echo
"SendCommand:".$strCommand."/r/n";
}
else
{
echo
"SendCommand:PASS******/r/n";
}

}
if(!
$this->getIsConnect())
{
return
false;
}
if(
trim($strCommand)=='')
{
$this->setMessage('Requestcommandisempty',1004);
return
false;
}
$this->strRequest=$strCommand."/r/n";
$this->arrRequest[]=$strCommand;
fputs($this->resHandler,$this->strRequest);
return
true;
}

//提取响应信息第一行
functiongetLineResponse()
{
if(!
$this->getIsConnect())
{
return
false;
}
$this->strResponse=fgets($this->resHandler,$this->intBuffSize);
$this->arrResponse[]=$this->strResponse;

return
$this->strResponse;
}

//提取若干响应信息,$intReturnType是返回值类型,1为字符串,2为数组
functiongetRespMessage($intReturnType)
{
if(!
$this->getIsConnect())
{
return
false;
}
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);
return
false;
}
if(!
preg_match("/^/+OK/",$strRespMessage))
{
$this->setMessage($strRespMessage,2000);
return
false;
}
return
true;
}

//获取是否已连接
functiongetIsConnect()
{
if(!
$this->resHandler)
{
$this->setMessage("Nonexistentavailabilityconnectionhandler",2002);
return
false;
}
return
true;
}


//设置消息
functionsetMessage($strMessage,$intErrorNum)
{
if(
trim($strMessage)==''||$intErrorNum=='')
{
return
false;
}
$this->strMessage=$strMessage;
$this->intErrorNum=$intErrorNum;
return
true;
}

//获取消息
functiongetMessage()
{
return
$this->strMessage;
}

//获取错误号
functiongetErrorNum()
{
return
$this->intErrorNum;
}

//获取请求信息
functiongetRequest()
{
return
$this->strRequest;
}

//获取响应信息
functiongetResponse()
{
return
$this->strResponse;
}


//---------------
//邮件原子操作
//---------------

//登录邮箱
functionpopLogin()
{
if(!
$this->getIsConnect())
{
return
false;
}
$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);
return
false;
}
$this->bolIsLogin=true;
return
true;
}

//退出登录
functionpopLogout()
{
if(!
$this->getIsConnect()&&$this->bolIsLogin)
{
return
false;
}
$this->sendCommand("QUIT");
$this->getLineResponse();
if(!
$this->getRestIsSucceed())
{
return
false;
}
return
true;
}

//获取是否在线
functiongetIsOnline()
{
if(!
$this->getIsConnect()&&$this->bolIsLogin)
{
return
false;
}
$this->sendCommand("NOOP");
$this->getLineResponse();
if(!
$this->getRestIsSucceed())
{
return
false;
}
return
true;
}

//获取邮件数量和字节数(返回数组)
functiongetMailSum($intReturnType=2)
{
if(!
$this->getIsConnect()&&$this->bolIsLogin)
{
return
false;
}
$this->sendCommand("STAT");
$strLineResponse=$this->getLineResponse();
if(!
$this->getRestIsSucceed())
{
return
false;
}
if(
$intReturnType==1)
{
return
$this->strResponse;
}
else
{
$arrResponse=explode("",$this->strResponse);
if(!
is_array($arrResponse)||count($arrResponse)<=0)
{
$this->setMessage('STATcommandresponsemessageiserror',2006);
return
false;
}
returnarray(
$arrResponse[1],$arrResponse[2]);
}
}

//获取指定邮件得SessionId
functiongetMailSessId($intMailId,$intReturnType=2)
{
if(!
$this->getIsConnect()&&$this->bolIsLogin)
{
return
false;
}
if(!
$intMailId=intval($intMailId))
{
$this->setMessage('Mailmessageidinvalid',1005);
return
false;
}
$this->sendCommand("UIDL".$intMailId);
$this->getLineResponse();
if(!
$this->getRestIsSucceed())
{
return
false;
}
if(
$intReturnType==1)
{
return
$this->strResponse;
}
else
{
$arrResponse=explode("",$this->strResponse);
if(!
is_array($arrResponse)||count($arrResponse)<=0)
{
$this->setMessage('UIDLcommandresponsemessageiserror',2006);
return
false;
}
returnarray(
$arrResponse[1],$arrResponse[2]);
}
}

//取得某个邮件的大小
functiongetMailSize($intMailId,$intReturnType=2)
{
if(!
$this->getIsConnect()&&$this->bolIsLogin)
{
return
false;
}
$this->sendCommand("LIST".$intMailId);
$this->getLineResponse();
if(!
$this->getRestIsSucceed())
{
return
false;
}
if(
$intReturnType==1)
{
return
$this->strResponse;
}
else
{
$arrMessage=explode('',$this->strResponse);
returnarray(
$arrMessage[1],$arrMessage[2]);
}
}

//获取邮件基本列表数组
functiongetMailBaseList($intReturnType=2)
{
if(!
$this->getIsConnect()&&$this->bolIsLogin)
{
return
false;
}
$this->sendCommand("LIST");
$this->getLineResponse();
if(!
$this->getRestIsSucceed())
{
return
false;
}
return
$this->getRespMessage($intReturnType);
}

//获取指定邮件所有信息,intReturnType是返回值类型,1是字符串,2是数组
functiongetMailMessage($intMailId,$intReturnType=1)
{
if(!
$this->getIsConnect()&&$this->bolIsLogin)
{
return
false;
}
if(!
$intMailId=intval($intMailId))
{
$this->setMessage('Mailmessageidinvalid',1005);
return
false;
}
$this->sendCommand("RETR".$intMailId);
$this->getLineResponse();
if(!
$this->getRestIsSucceed())
{
return
false;
}
return
$this->getRespMessage($intReturnType);
}

//获取某邮件前指定行,$intReturnType返回值类型,1是字符串,2是数组
functiongetMailTopMessage($intMailId,$intTopLines=10,$intReturnType=1)
{
if(!
$this->getIsConnect()&&$this->bolIsLogin)
{
return
false;
}
if(!
$intMailId=intval($intMailId)||!$intTopLines=int($intTopLines))
{
$this->setMessage('MailmessageidorToplinesnumberinvalid',1005);
return
false;
}
$this->sendCommand("TOP".$intMailId."".$intTopLines);
$this->getLineResponse();
if(!
$this->getRestIsSucceed())
{
return
false;
}
return
$this->getRespMessage($intReturnType);
}

//删除邮件
functiondelMail($intMailId)
{
if(!
$this->getIsConnect()&&$this->bolIsLogin)
{
return
false;
}
if(!
$intMailId=intval($intMailId))
{
$this->setMessage('Mailmessageidinvalid',1005);
return
false;
}
$this->sendCommand("DELE".$intMailId);
$this->getLineResponse();
if(!
$this->getRestIsSucceed())
{
return
false;
}
return
true;
}

//重置被删除得邮件标记为未删除
functionresetDeleMail()
{
if(!
$this->getIsConnect()&&$this->bolIsLogin)
{
return
false;
}
$this->sendCommand("RSET");
$this->getLineResponse();
if(!
$this->getRestIsSucceed())
{
return
false;
}
return
true;
}



//---------------
//调试操作
//---------------

//输出对象信息
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();
*/

?>

你可能感兴趣的:(PHP)