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