
|  | 
| 技术资料  > .Net专区 > Asp.Net开发 : 利用asp+的独特的底层操作的功能实现对Pop服务器的存?/td> |  | 利用asp+的独特的底层操作的功能实现对Pop服务器的存?/H1>March 25,2004
 |  | http://www.asp888.net 豆腐技术站 
 前面我曾经讲过如何在asp.net下利用socket编程实现域名查询,详细情况请看文章:asp+中实现域名查询的完整代码
 豆腐有一天突然想,既然可以利用socket实现域名查询,那是不是只要是利用到socket客户端
 编程的以前的 Windows 桌面程序都可以用asp.net 实现呢?说干就干,我第一个准备要做的就是
 一个asp.net 版本的邮件接收程序,我们知道,在asp+中发送Email是见很方便的事情(asp+发送Email完全手册),可是怎么进行
 收取pop信件的程序呢?看来只有拿出豆腐的杀手剑了:)
 首先我们来看看这个程序的代码:pop.aspx
 <%@ Assembly Name="System.Net" %>
 <%@ Import Namespace="System.Net" %>
 <% @Import Namespace="System.Net.Sockets" %>
 <%@ Import Namespace="System.IO" %>
 <script language="C#" runat=server>
 protected void Page_Load(Object Src, EventArgs E){
 String user="doufu"; //邮箱用户代码
 String pass="asp888.net"; //邮箱用户密码
 String popserver="localhost"; //pop服务器IP地址
 TCPClient tcpc = new TCPClient();
 if (0 == tcpc.Connect(popserver, 110))
 {
 //如果程序执行到这里,就表示连接Pop Server 成功
 Stream s;
 StreamReader sr ;
 String strCmd;
 Byte[] arrCmd;
 String strRet;
 String[] arrRet;
 
 
 
 sr = new StreamReader(tcpc.GetStream(), Encoding.Default);
 Response.Write(sr.ReadLine() + "<br>"); //mail server 的欢迎语
 
 strRet=Logon(tcpc,user,pass);
 
 if(JudgeString(strRet)!="+OK"){
 Response.Write("对不起,没有这个用户/密码 不匹配");
 return;
 }
 
 //用户和密码 匹配,下面开始 统计用户信箱的信息
 //这个数组中包括了所有的返回信息
 arrRet=StaticMailBox(tcpc);
 if(arrRet[0]!="+OK"){
 Response.Write("出错了!");
 return;
 }
 Response.Write("当前的用户<font color=blue>" + user + "</font>的信箱中共有<font color=red>" + arrRet[1] + "</font>封,共占<font color=red>" + arrRet[2] + "</font>Byte");
 
 //收信
 arrRet=PopMail(tcpc,4);
 //判断返回
 if(arrRet[0]!="+OK"){
 Response.Write("出错了");
 }
 Response.Write("邮件日期:" + arrRet[1] + "n<br>");
 Response.Write("发信人:" + arrRet[2] + "n<br>");
 Response.Write("收信人:" + arrRet[3] + "n<br>");
 Response.Write("邮件主题:" + arrRet[4] + "n<br>");
 Response.Write("邮件内容:" + arrRet[5] + "n<br>");
 //关闭Socket联结
 tcpc.Close();
 }
 else
 {
 Response.Write("Could not connect to server!");
 }
 }
 String SendPopCmd(TCPClient tcpc,String strCmd){
 Byte[] arrCmd;
 String strRet;
 StreamReader sr;
 Stream s;
 s=tcpc.GetStream();
 strCmd = strCmd + "rn";
 arrCmd= Encoding.Default.GetBytes(strCmd.ToCharArray());
 s=tcpc.GetStream();
 s.Write(arrCmd, 0, strCmd.Length);
 sr = new StreamReader(tcpc.GetStream(), Encoding.Default);
 strRet=sr.ReadLine();
 return strRet;
 }
 String Logon(TCPClient tcpc,String user,String pass){
 //这个函数的功能是 对 获得联结的用户 身份进行验证
 //发送 用户代码
 String strRet;
 strRet=SendPopCmd(tcpc,"user " + user);
 strRet=SendPopCmd(tcpc,"pass " + pass);
 return strRet;
 }
 String[] StaticMailBox(TCPClient tcpc){
 String strRet;
 strRet=SendPopCmd(tcpc,"stat");
 if(JudgeString(strRet)!="+OK"){
 return "-ERR -ERR".Split(" ".ToCharArray());
 }
 String[] arrRet=strRet.Split(" ".ToCharArray());
 return arrRet;
 }
 String JudgeString(String strCheck){
 if(strCheck.Substring(0,3)!="+OK"){
 return "-ERR";
 }
 else
 return "+OK";
 }
 String[] PopMail(TCPClient tcpc,int i){
 String strRet;
 bool strBody=false;
 String[] arrRet =new String[10];
 String[] arrTemp;
 strRet=SendPopCmd(tcpc,"retr " + i.ToString());
 if(JudgeString(strRet)!="+OK"){
 //表示没有这个信件 或者 其他的错误
 return "-ERR -ERR".Split(" ".ToCharArray());
 }
 StreamReader sr;
 sr = new StreamReader(tcpc.GetStream(), Encoding.Default);
 Response.Write("n<BR>");
 Response.Write("<font color=red>n<BR>");
 while (sr.Peek()!=46)
 {
 //呵呵,不知道 为什么 非要是 46 才可以!
 strRet=sr.ReadLine();
 arrTemp=strRet.Split(":".ToCharArray());
 if(strRet=="")
 strBody=true; //现在开始接收 Body 的信息
 if(arrTemp[0]=="Date"){
 arrRet[1]=arrTemp[1]; //信件的发送日期
 }
 if(arrTemp[0]=="From")
 arrRet[2]=arrTemp[1]; //发信人
 if(arrTemp[0]=="To")
 arrRet[3]=arrTemp[1]; //收信人
 if(arrTemp[0]=="Subject")
 arrRet[4]=arrTemp[1]; //主题
 if(strBody){
 arrRet[5]=arrRet[5] + strRet + "n";
 }
 }
 
 arrRet[0]="+OK";
 return arrRet;
 }
 </script>
 好了大家通过这个程序,首先可以了解到pop(Post Ofice Protocal)协议,其次可以加深对asp.net的socket 程序的
 理解,还可以通过这个程序接收ISP提供的没有Web方式收取邮件的程序对ISP的信箱进行管理。这个程序主要是对asp.net
 操作pop服务器进行编程,加上时间仓促,所以很多地方都直接用了Response.Write("")这样的语句,我的意思是这篇文章
 只是简单的知识讲解,大家最终具体应用的时候,肯定是要另外优化这段程序的!那边有人扔砖头了:这个豆腐怎么这么懒:)
 
 
 |  | 
  
Copyright © 2001-2008 Shenzhen Hiblue Software Team All rights reserved