Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 网站建设 > 网页制作 > 使用PHP写的POP3操作类
【标  题】:使用PHP写的POP3操作类
【关键字】:PHP,POP3
【来  源】:http://blog.csdn.net/heiyeshuwu/archive/2006/07/03/870972.aspx

使用PHP写的POP3操作类

Your Ad Here



使用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
 * 参考: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($strRespMessage2000
);
            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 getMessage
()
    {
        return 
$this->strMessage
;
    }

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

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

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


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

    //登录邮箱
    
function popLogin
()
    {
        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->strResponse2004
);
            return 
false
;
        }        
        
$this->bolIsLogin true
;
        return 
true
;
    }

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

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

    
//获取邮件数量和字节数(返回数组)
    
function getMailSum($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('STAT command response message is error'2006
);
                return 
false
;
            }
            return array(
$arrResponse[1], $arrResponse[2
]);
        }
    }

    
//获取指定邮件得Session Id
    
function getMailSessId($intMailId$intReturnType=2
)
    {
        if (!
$this->getIsConnect() && $this->bolIsLogin
)
        {
            return 
false
;
        }
        if (!
$intMailId intval($intMailId
))
        {
            
$this->setMessage('Mail message id invalid'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('UIDL command response message is error'2006
);
                return 
false
;
            }
            return array(
$arrResponse[1], $arrResponse[2
]);
        }
    }

    
//取得某个邮件的大小
    
function getMailSize($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
);
            return array(
$arrMessage[1], $arrMessage[2
]);
        }
    }

    
//获取邮件基本列表数组
    
function getMailBaseList($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是数组
    
function getMailMessage($intMailId$intReturnType=1
)
    {
        if (!
$this->getIsConnect() && $this->bolIsLogin
)
        {
            return 
false
;
        }
        if (!
$intMailId intval($intMailId
))
        {
            
$this->setMessage('Mail message id invalid'1005
);
            return 
false
;
        }
        
$this->sendCommand("RETR "$intMailId
);
        
$this->getLineResponse
();
        if (!
$this->getRestIsSucceed
())
        {
            return 
false
;
        }
        return 
$this->getRespMessage($intReturnType
);
    }

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

    
//删除邮件
    
function delMail($intMailId
)
    {
        if (!
$this->getIsConnect() && $this->bolIsLogin
)
        {
            return 
false
;
        }
        if (!
$intMailId=intval($intMailId
))
        {
            
$this->setMessage('Mail message id invalid'1005
);
            return 
false
;
        }
        
$this->sendCommand("DELE ".$intMailId
);
        
$this->getLineResponse
();
        if (!
$this->getRestIsSucceed
())
        {
            return 
false
;
        }
        return 
true
;
    }

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



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

    //输出对象信息
    
function printObject
()
    {
        
print_r($this
);
        exit;
    }

    
//输出错误信息
    
function printError
()
    {
        echo 
"[Error Msg] : $strMessage     <br>\n"
;
        echo 
"[Error Num] : $intErrorNum <br>\n"
;
        exit;
    }

    
//输出主机信息
    
function printHost
()
    {
        echo 
"[Host]  : $this->strHost <br>\n"
;
        echo 
"[Port]  : $this->intPort <br>\n"
;
        echo 
"[Email] : $this->strEmail <br>\n"
;
        echo 
"[Passwd] : ******** <br>\n"
;
        exit;
    }

    
//输出连接信息
    
function printConnect
()
    {
        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 = new SocketPOPClient('abc@126.com', '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();
*/

?> 
 

今天刚开了一个论坛请大家多多得关照!!!:【上一篇】
ASP.NET.2.0.in.C.Sharp.2005.From.Novice.to.Professional的读书笔记[8]:【下一篇】
【相关文章】
  • 为什么说用PHP开发大型系统令人不爽
  • PHP不能适应大型应用的理由
  • PHP下解析swf文件头
  • PHP 5.1.* 中调用 Java
  • 在php中执行root命令(原创)
  • Perl,python,Php超强开发工具Komodo3.5.3注册机
  • 安装phpMyAdmin
  • 如何加速你的PHP程序
  • suPHP - 以属主身份来运行php
  • 我来评PHP与面向对象
  • 【随机文章】
  • 索引与系统性能
  • 比较PHPLIB Template和FastTemplate
  • 一个关于乘法溢出问题的探讨
  • 在Eclipse3.1中如何使用Lomboz3.1开发JSP
  • Windows XP 中掌握对16位应用程序进行标注的方法
  • 谁动了项目的时间?
  • RedHat AS4 添加中文界面和输入法
  • 巧用winbind服务来使window200xPDC为你做认证 (原作者:eagerlinuxer )
  • DOS下如何上网
  • 学习python,入了门之后决定先学一下GUI,然后再学NETWORK PROGRAM
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.