利用asp+的独特的底层操作的功能实现对Pop服务器的存取(实现了asp+收pop信件的功能)

http://www.asp888.net 豆腐技术站

前面我曾经讲过如何在asp.net下利用socket编程实现域名查询,详细情况请看文章:asp+中实现域名查询的完整代码
豆腐有一天突然想,既然可以利用socket实现域名查询,那是不是只要是利用到socket客户端
编程的以前的 Windows 桌面程序都可以用asp.net 实现呢?说干就干,我第一个准备要做的就是
一个asp.net 版本的邮件接收程序,我们知道,在asp+中发送Email是见很方便的事情(asp+发送Email完全手册),可是怎么进行
收取pop信件的程序呢?看来只有拿出豆腐的杀手剑了:)
首先我们来看看这个程序的代码:pop.aspx

1@ Assembly Name="System.Net" 
1@ Import Namespace="System.Net" 
1 @Import Namespace="System.Net.Sockets" 
1@ Import Namespace="System.IO" 
  1<script language="C#" runat="server">   
  2protected void Page_Load(Object Src, EventArgs E){   
  3String user="doufu"; //邮箱用户代码   
  4String pass="asp888.net"; //邮箱用户密码   
  5String popserver="localhost"; //pop服务器IP地址   
  6TCPClient tcpc = new TCPClient();   
  7if (0 == tcpc.Connect(popserver, 110))   
  8{   
  9//如果程序执行到这里,就表示连接Pop Server 成功   
 10Stream s;   
 11StreamReader sr ;   
 12String strCmd;   
 13Byte[] arrCmd;   
 14String strRet;   
 15String[] arrRet; 
 16
 17sr = new StreamReader(tcpc.GetStream(), Encoding.Default);   
 18Response.Write(sr.ReadLine() + "<br>"); //mail server 的欢迎语 
 19
 20strRet=Logon(tcpc,user,pass); 
 21
 22if(JudgeString(strRet)!="+OK"){   
 23Response.Write("对不起,没有这个用户/密码 不匹配");   
 24return;   
 25} 
 26
 27//用户和密码 匹配,下面开始 统计用户信箱的信息   
 28//这个数组中包括了所有的返回信息   
 29arrRet=StaticMailBox(tcpc);   
 30if(arrRet[0]!="+OK"){   
 31Response.Write("出错了!");   
 32return;   
 33}   
 34Response.Write("当前的用户<font color=blue>" + user + "</font>的信箱中共有<font color=red>" + arrRet[1] + "</font>封,共占<font color=red>" + arrRet[2] + "</font>Byte"); 
 35
 36//收信   
 37arrRet=PopMail(tcpc,4);   
 38//判断返回   
 39if(arrRet[0]!="+OK"){   
 40Response.Write("出错了");   
 41}   
 42Response.Write("邮件日期:" + arrRet[1] + "\n<br>");   
 43Response.Write("发信人:" + arrRet[2] + "\n<br>");   
 44Response.Write("收信人:" + arrRet[3] + "\n<br>");   
 45Response.Write("邮件主题:" + arrRet[4] + "\n<br>");   
 46Response.Write("邮件内容:" + arrRet[5] + "\n<br>");   
 47//关闭Socket联结   
 48tcpc.Close();   
 49}   
 50else   
 51{   
 52Response.Write("Could not connect to server!");   
 53}   
 54}   
 55String SendPopCmd(TCPClient tcpc,String strCmd){   
 56Byte[] arrCmd;   
 57String strRet;   
 58StreamReader sr;   
 59Stream s;   
 60s=tcpc.GetStream();   
 61strCmd = strCmd + "\r\n";   
 62arrCmd= Encoding.Default.GetBytes(strCmd.ToCharArray());   
 63s=tcpc.GetStream();   
 64s.Write(arrCmd, 0, strCmd.Length);   
 65sr = new StreamReader(tcpc.GetStream(), Encoding.Default);   
 66strRet=sr.ReadLine();   
 67return strRet;   
 68}   
 69String Logon(TCPClient tcpc,String user,String pass){   
 70//这个函数的功能是 对 获得联结的用户 身份进行验证   
 71//发送 用户代码   
 72String strRet;   
 73strRet=SendPopCmd(tcpc,"user " + user);   
 74strRet=SendPopCmd(tcpc,"pass " + pass);   
 75return strRet;   
 76}   
 77String[] StaticMailBox(TCPClient tcpc){   
 78String strRet;   
 79strRet=SendPopCmd(tcpc,"stat");   
 80if(JudgeString(strRet)!="+OK"){   
 81return "-ERR -ERR".Split(" ".ToCharArray());   
 82}   
 83String[] arrRet=strRet.Split(" ".ToCharArray());   
 84return arrRet;   
 85}   
 86String JudgeString(String strCheck){   
 87if(strCheck.Substring(0,3)!="+OK"){   
 88return "-ERR";   
 89}   
 90else   
 91return "+OK";   
 92}   
 93String[] PopMail(TCPClient tcpc,int i){   
 94String strRet;   
 95bool strBody=false;   
 96String[] arrRet =new String[10];   
 97String[] arrTemp;   
 98strRet=SendPopCmd(tcpc,"retr " + i.ToString());   
 99if(JudgeString(strRet)!="+OK"){   
100//表示没有这个信件 或者 其他的错误   
101return "-ERR -ERR".Split(" ".ToCharArray());   
102}   
103StreamReader sr;   
104sr = new StreamReader(tcpc.GetStream(), Encoding.Default);   
105Response.Write("\n<BR>");   
106Response.Write("<font color=red>\n<BR>");   
107while (sr.Peek()!=46)   
108{   
109//呵呵,不知道 为什么 非要是 46 才可以!   
110strRet=sr.ReadLine();   
111arrTemp=strRet.Split(":".ToCharArray());   
112if(strRet=="")   
113strBody=true; //现在开始接收 Body 的信息   
114if(arrTemp[0]=="Date"){   
115arrRet[1]=arrTemp[1]; //信件的发送日期   
116}   
117if(arrTemp[0]=="From")   
118arrRet[2]=arrTemp[1]; //发信人   
119if(arrTemp[0]=="To")   
120arrRet[3]=arrTemp[1]; //收信人   
121if(arrTemp[0]=="Subject")   
122arrRet[4]=arrTemp[1]; //主题   
123if(strBody){   
124arrRet[5]=arrRet[5] + strRet + "\n";   
125}   
126} 
127
128arrRet[0]="+OK";   
129return arrRet;   
130}   
131</script>

好了大家通过这个程序,首先可以了解到pop(Post Ofice Protocal)协议,其次可以加深对asp.net的socket 程序的
理解,还可以通过这个程序接收ISP提供的没有Web方式收取邮件的程序对ISP的信箱进行管理。这个程序主要是对asp.net
操作pop服务器进行编程,加上时间仓促,所以很多地方都直接用了Response.Write("")这样的语句,我的意思是这篇文章

Published At
Categories with Web编程
Tagged with
comments powered by Disqus