asp.net實現pop功能
2024-07-10 12:57:57
供稿:網友
 
/*
  豆腐制作 都是精品
  http://www.asp888.net  豆腐技術站
  如轉載 請保留完整版權信息
*/
前面我曾經講過如何在asp.net下利用socket編程實現域名查詢,詳細情況請看文章:[url]http://www.asp888.net/lanmu/viewarticle.asp?id=51[title]asp+中實現域名查詢的完整代碼[/title][/url]
豆腐有一天突然想,既然可以利用socket實現域名查詢,那是不是只要是利用到socket客戶端
編程的以前的 windows 桌面程序都可以用asp.net 實現呢?說干就干,我第一個準備要做的就是
一個asp.net 版本的郵件接收程序,我們知道,在asp+中發送email是見很方便的事情([url]http://www.asp888.net/lanmu/viewarticle.asp?id=95[title]asp+發送email完全手冊[/title][/url]),可是怎么進行
收取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("")這樣的語句,我的意思是這篇文章
只是簡單的知識講解,大家最終具體應用的時候,肯定是要另外優化這段程序的!那邊有人扔磚頭了:這個豆腐怎么這么懶:)