扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
查看 POP3/SMTP 协议的时候想尝试一下自己写一个操作类,核心没啥,就是使用 fsockopen ,然后写入/接收数据,只实现了最核心的部分功能,当作是学习 Socket 操作的练手。其中参考了 RFC 2449和一个国外的简单Web邮件系统 Uebimiau 的部分代码,不过绝对没有抄他滴,HOHO,绝对原创。如果你喜欢,请收藏,随便修改,嗯,但是记得不要删除偶类里的声名,毕竟偶也是辛辛苦苦写了好几天呐。
另外,欢迎自由发挥,改善或者修正这个类,希望能够为你所用。代码没有认真仔细的调试,发现bug请自己修正,HOHO!
<?php
/**
* 类名:SocketPOPClient
* 功能:POP3 协议客户端的基本操作类
* 作者:heiyeluren <http://blog.csdn.net/heiyeshuwu>
* 时间:2006-7-3
* 参考:RFC 2449, Uebimiau
* 授权:BSD License
*/
class SocketPOPClient
{
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();
//---------------
// 基础操作
//---------------
//构造函数
function SocketPOP3Client($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('Email address or Passwd is empty', 1001);
return false;
}
if (!preg_match("/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/i", $this->strEmail))
{
$this->setMessage('Email address invalid', 1002);
return false;
}
if ($this->strHost=='')
{
$this->strHost = substr(strrchr($this->strEmail, "@"), 1);
}
if ($intPort!='')
{
$this->intPort = $intPort;
}
$this->connectHost();
}
//连接服务器
function connectHost()
{
if ($this->bolDebug)
{
echo "Connection ".$this->strHost." ...\r\n";
}
if (!$this->getIsConnect())
{
if ($this->strHost=='' || $this->intPort=='')
{
$this->setMessage('POP3 host or Port is empty', 1003);
return false;
}
$this->resHandler = @fsockopen($this->strHost, $this->intPort, &$this->intErrorNum, &$this->strMessage, $this->intConnSecond);
if (!$this->resHandler)
{
$strErrMsg = 'Connection POP3 host: '.$this->strHost.' failed';
$intErrNum = 2001;
$this->setMessage($strErrMsg, $intErrNum);
return false;
}
$this->getLineResponse();
if (!$this->getRestIsSucceed())
{
return false;
}
}
return true;
}
//关闭连接
function closeHost()
{
if ($this->resHandler)
{
fclose($this->resHandler);
}
return true;
}
//发送指令
function sendCommand($strCommand)
{
if ($this->bolDebug)
{
if (!preg_match("/PASS/", $strCommand))
{
echo "Send Command: ".$strCommand."\r\n";
}
else
{
echo "Send Command: PASS ******\r\n";
}
}
if (!$this->getIsConnect())
{
return false;
}
if (trim($strCommand)=='')
{
$this->setMessage('Request command is empty', 1004);
return false;
}
$this->strRequest = $strCommand."\r\n";
$this->arrRequest[] = $strCommand;
fputs($this->resHandler, $this->strRequest);
return true;
}
//提取响应信息第一行
function getLineResponse()
{
if (!$this->getIsConnect())
{
return false;
}
$this->strResponse = fgets($this->resHandler, $this->intBuffSize);
$this->arrResponse[] = $this->strResponse;
return $this->strResponse;
}
//提取若干响应信息,$intReturnType是返回值类型, 1为字符串, 2为数组
function getRespMessage($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;
}
}
//提取请求是否成功
function getRestIsSucceed($strRespMessage='')
{
if (trim($responseMessage)=='')
{
if ($this->strResponse=='')
{
$this->getLineResponse();
}
$strRespMessage = $this->strResponse;
}
if (trim($strRespMessage)=='')
{
$this->setMessage('Response message is empty', 2003);
return false;
}
if (!preg_match("/^\+OK/", $strRespMessage))
{
$this->setMessage($strRespMessage, 2000);
return false;
}
return true;
}
//获取是否已连接
function getIsConnect()
{
if (!$this->resHandler)
{
$this->setMessage("Nonexistent availability connection handler", 2002);
return false;
}
return true;
}
//设置消息
function setMessage($strMessage, $intErrorNum)
{
if (trim($strMessage)=='' || $intErrorNum=='')
{
return false;
}
$this->strMessage = $strMessage;
$this->intErrorNum = $intErrorNum;
return true;
}
//获取消息
function return ;
}
//获取错误号
function return ;
}
//获取请求信息
function return
//获取响应信息
function
return
//---------------
// 邮件原子操作
//---------------
//登录邮箱
function ()
{
if return
}
("USER ".
("PASS ".
if (!)
{
);
return ;
}
;
return
}
//退出登录
function {
if (!() && {
return ("QUIT");
();
if (!())
{
return ;
}
return ;
}
//获取是否在线
function ()
{
if (!->() && )
{
return ;
}
("NOOP");
->();
if (!->())
{
return ;
}
return
}
//获取邮件数量和字节数(返回数组)
function )
{
if (!->() && return }
("STAT");
();
if (!{
return ;
}
if
{
return else
{
if (!)<=)
{
('STAT command response message is error', );
return ;
}
return array
}
}
//获取指定邮件得Session Id
function )
{
if () &&
{
return ;
}
if
{
('Mail message id invalid',
return ;
}
("UIDL ".
if return
}
if (
{
return
}
else
{
(" ", );
if (!) || )<=)
{
('UIDL command response message is error', );
return ;
}
return array[]);
}
}
//取得某个邮件的大小
function , if (!() && return ;
}
("LIST ". if (!())
{
return if )
{
return }
else
{
return array( }
//获取邮件基本列表数组
function )
{
if () && return ;
}
("LIST");
();
if (!())
{
return ;
}
return );
}
//获取指定邮件所有信息,intReturnType是返回值类型,1是字符串,2是数组
function )
{
if (!() &&
{
return ;
}
if ))
{
->('Mail message id invalid',);
return ;
}
->("RETR ". );
->();
if (!())
{
return ;
}
return );
}
//获取某邮件前指定行, $intReturnType 返回值类型,1是字符串,2是数组
function )
{
if () &&
{
return ;
}
if (!
{
('Mail message id or Top lines number invalid', );
return ;
}
("TOP ". ." ". );
->();
if (!())
{
return
}
return );
}
//删除邮件
function )
{
if (!() && )
{
return ;
}
if (!
{
->('Mail message id invalid', );
return ;
}
->("DELE ".);
->();
if (!->())
{
return ;
}
return ;
}
//重置被删除得邮件标记为未删除
function ()
{
if (!->() && ->)
{
return ;
}
("RSET");
->();
if (!->())
{
return ;
}
return ;
}
//---------------
// 调试操作
//---------------
//输出对象信息
function ()
{
exit;
}
//输出错误信息
function ()
{
echo "[Error Msg] : $strMessage <br>\n";
echo "[Error Num] : $intErrorNum <br>\n";
exit;
}
//输出主机信息
function ()
{
echo "[Host] : $this->strHost <br>\n";
echo "[Port] : $this->intPort <br>\n";
echo "[Email] : $this->strEmail <br>\n";
echo "[Passwd] : ******** <br>\n";
exit;
}
//输出连接信息
function ()
{
echo "[Connect] : $this->resHandler <br>\n";
echo "[Request] : $this->strRequest <br>\n";
echo "[Response] : $this->strResponse <br>\n";
exit;
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者