个人管理功能

在CSDN Blog撰写技术文章,即有机会入选CSDN技术中心,现在就去免费注册!已注册用户,点击登录

热门标签

专题历史

有人说SOA是一种IT策略,有人说SOA是一种架构理念,还有人说SOA是一种服务。SOA到底是什么?它将带来什么?软件产业的变革亦或是新的机遇下的挑战?业界权威专家带领我们一起去深究,去探索。BEA三位重量级专家与您共同探讨SOA

随着WPF/E更名为正式名称Silverlight,以及Silverlight 1.1 Alpha 版本的发布,答案变得清晰,而且令人兴奋! - 一个跨操作系统,跨浏览器的Web应用平台出现了。Silverlight 这样一个4.5MB的浏览器插件(1.1 Alpha文件)是如何做到的这些的?周岳: SilverLight-Web应用的一道强光

中国移动用户数量在大踏步地发展与增长,根据产业部的数据,仅三月就新增了670万户。预估计6月份之后,中国很快将迎来第五亿手机用户(平均不到3人拥有一台手机)而J2ME做为最重要的手机跨平台技术,凭借Java平台以其良好的开放性和支持能力,得到了众多手机厂商的支持。对众多开发者来说,J2ME程序易于移植,轻松实现“一次编写,到处运行”。J2ME系列开发专题,将带你从最基本的工具安装,环境配置开始,进入移动应用开发的世界。
 
CSDN移动开发系列之-“J2ME开发实训”

7月31日-8月1日,即将在上海召开甲骨文全球大会•亚太地区会议同期举行的甲骨文开发者大会,这是一项付费参加的面向开发人员的活动。在甲骨文开发者大会期间,您将听到世界一流的专家讲述如何使用Java、.NET、XML和PL/SQL以及Ajax、PHP、Spring、Groovy on Rails等流行技术来简化开发过程。在为期两天的甲骨文开发者大会中,您将能够提高自身的开发技能,扩充知识,参加几十场由专家主持的深入细致的技术讲座并在专家的辅导下进行上机操作、了解高级技能和获得详细指导。在甲骨文开发者大会期间,您有机会直接向业界一流的技术专家和开发人员请教。欢迎参加甲骨文全球大会·2007·亚太地区开发者大会

2007年6月29日,自由软件基金会宣布,其创始人Richard Stallman将在GNU的网站上,在本周太平洋时间星期五上午9点通过视频发布GPLv3。本来,GPL并不是所有开源组织所认可的协议。其从出现以来一直存在争议,GPL被认为是一种“病毒式”的协议,BSD的fans和老牌Unix黑客们认为,他们编写Unix的年头都比GPL声明要长得多,他们更愿意采用比GPL更加的自由的BSD协议。今天,开源社区中有70%左右的项目采用了GPL。很多在开源社区的老牌黑客们认为,Richard Stallman所鼓吹开源软件的言行与当年卡尔·马克思号召产业无产阶级反抗工作的努力如出一辙。在GPLv3的第三版修订案发布时,开源软件团体中的许多成员都反对这种协议。尤其是Linux的核心开发小组,其中29个高级架构师有28个反对这个协议。Linus Torvalds称这个协议有“宗教性质”,并公开反对。而整个软件行业特别是开源社区对GPLv3的争论也愈演愈烈。GPLv3:大教堂和集市的新一轮对抗

2007年7月14日由CSDN与ThoughtWorks联合主办的第二届“敏捷中国”技术大会在北京丽亭华苑酒店召开,多位开源社区和ThoughtWorks公司的技术领袖即将带来精彩的演讲。本次“敏捷中国”技术大会集中展现塑造敏捷企业所需的方方面面:业界领先的敏捷项目管理工具;极大提升软件开发效率的新语言和新框架;数据库领域的敏捷实践;全方位的敏捷项目管理指导;还有身临其境的亲身体验。来自开源社区和ThoughtWorks公司的技术领导者们将带领听众全面感受敏捷企业。“敏捷中国大会”现场直击

从2004年起,在每年的夏季,CSDN都会举办面向中国程序员的大型网上调查活动。这是中国样本最丰富的开发者社区调查,持续、全面和深入地反映了中国开发者社群自身状况、各项技术、工具、产品的使用状况和发展趋势,是完整、准确地了解中国开发者市场的重要参考资料。本次调查覆盖基础信息、.NET、Java、C/C++、Web开发、数据库应用开发、软件工程及项目管理、移动及嵌入式开发、开放源代码、企业信息化等10个领域。还有惊喜大奖等着你哦,赶快进入吧! 2007中国软件开发者大调查正式启动

推荐作者
  • 大宝大宝

    时间如流水,知惜方成功。

  • SkymanSkyman

    江苏人氏,梅兰芳之老乡。现游学渝州之最...

  • ralph623ralph623

新进作者
  • 冲 s冲 s

  • 小鱼小鱼

  • 棱角棱角

    多年J2EE构架设计与开发经验,专注于企业信息系统建设,精通Java设计模式,并能熟练的运用到企业开发中。 精通Struts与Spring框架。数据库方面精通Oracle数据库,从事过数据库方面的开发以及oracle优化方面的工作。

最新技术图书推荐
使用PHP写的POP3操作类

发表日期:2006-7-04
更新日期:2006-7-04
作者文章阅读次数:3911

源自:黑夜路人 (个人网站) 标签:

您认为本文应该得        共有3人参与打分打印|收藏|讨论|投诉

查看 POP3/SMTP 协议的时候想尝试一下自己写一个操作类,核心没啥,就是使用 fsockopen ,然后写入/接收数据,只实现了最核心的部分功能,当作是学习 Socket 操作的练手。其中参考了 RFC 2449和一个国外的简单Web邮件系统 Uebimiau 的部分代码,不过绝对没有抄他滴,HOHO,绝对原创。



使用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();
*/

?> 
 

您认为本文应该得        共有3人参与打分打印|收藏|讨论|投诉

暂无图片

既然决定了远行,就不要害怕艰难险阻!

评论

CSDN技术中心团队官方Blog:http://blog.csdn.net/techcenter/,反馈邮箱:techcenter at csdn.net (注意:请把 at 换成@)


网站简介广告服务网站地图帮助联系方式诚聘英才English问题报告

北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号

世纪乐知(北京)网络技术有限公司 提供技术支持

Copyright © 2000-2008, CSDN.NET, All Rights Reserved