tempad
ReadyGo!技术成就梦想 >>php实例 >> 使用PHP的Socket写的POP3类

使用PHP的Socket写的POP3类

ReadyGo!技术成就梦想 网络搜索 efish 2008-2-24 3:08:49

查看 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("/^+(\.+)*@+(\.+)+$/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 = $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    

[1]  [2]  [3]  [4]  [5]  上一页  下一页
责任编辑: efish 参与评论 查找更多:
相关文章
email address 生成图片程序 email address 生成图片程序
PHP+MYSQL留言本(三) PHP+MYSQL留言本(三)
搜索引擎技术核心揭密 搜索引擎技术核心揭密
多重條件組合查詢(一) 多重條件組合查詢(一)
多重條件組合查詢(二) 多重條件組合查詢(二)
文件上传的实现 文件上传的实现
BBS(php & mysql)完整版(三) BBS(php & mysql)完整版(三)
BBS(php & mysql)完整版(五) BBS(php & mysql)完整版(五)
BBS(php & mysql)完整版(六) BBS(php & mysql)完整版(六)
BBS(php & mysql)完整版(七) BBS(php & mysql)完整版(七)
2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn

分类导航
ReadyGo!技术成就梦想