使用PHP写的POP3操作类

本文介绍了一个使用PHP Socket编写的POP3客户端类,该类实现了基本的POP3协议操作,如连接服务器、登录、获取邮件列表等。作者参考了RFC2449标准及一个简单的Web邮件系统Uebimiau的部分代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



使用PHP的Socket写的POP3类

查看 POP3/SMTP 协议的时候想尝试一下自己写一个操作类,核心没啥,就是使用 fsockopen ,然后写入/接收数据,只实现了最核心的部分功能,当作是学习 Socket 操作的练手。其中参考了 RFC 2449和一个国外的简单Web邮件系统 Uebimiau 的部分代码,不过绝对没有抄他滴,HOHO,绝对原创。如果你喜欢,请收藏,随便修改,嗯,但是记得不要删除偶类里的声名,毕竟偶也是辛辛苦苦写了好几天呐。
另外,欢迎自由发挥,改善或者修正这个类,希望能够为你所用。代码没有认真仔细的调试,发现bug请自己修正,HOHO!

/**
 * 类名:SocketPOPClient
 * 功能:POP3 协议客户端的基本操作类
 * 作者:heiyeluren 
 * 时间: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     
/n"
;
        echo 
"[Error Num] : $intErrorNum 
/n"
;
        exit;
    }

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

    
//输出连接信息
    
function printConnect
()
    {
        echo 
"[Connect] : $this->resHandler 
/n"
;
        echo 
"[Request] : $this->strRequest 
/n"
;
        echo 
"[Response] : $this->strResponse 
/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();
*/

?> 
 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值