科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件使用PHP写的POP3操作类

使用PHP写的POP3操作类

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

查看 POP3/SMTP 协议的时候想尝试一下自己写一个操作类,核心没啥,就是使用 fsockopen ,然后写入/接收数据,只实现了最核心的部分功能,当作是学习 Socket 操作的练手。

作者:黑夜路人 来源: CSDN 2008年3月23日

关键字: POP3 PHP Web开发 操作 Linux

  • 评论
  • 分享微博
  • 分享邮件
使用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 
        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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章