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 + "\r\n"; 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("")这样的语句,我的意思是这篇文章
|