ASP.NET读取POP3邮件的操作

程序代码:
namespace POP3Client  
{  
    using System.IO ;  
    using System.Net;  
    using System.Net.Sockets ;  
    //Please note that all code is copyright 2002 by William J Dean  
    public class POP3client  
    {  
        public enum connect_state {disc,AUTHORIZATION,TRANSACTION,UPDATE};  

        public string user;  
        public string pwd;  
        public string pop;  
        public bool error;  
        public connect_state state=connect_state.disc ;  

        //borrowed from Agus Kurniawan's article:"Retrieve Mail From a POP3 Server Using C#"  at http://www.codeproject.com/csharp/popapp.asp    
        private TcpClient Server;  
        private NetworkStream NetStrm;  
        private StreamReader  RdStrm;  
        private string Data;  
        private byte[] szData;  
        private string CRLF = "\r\n";      

        public POP3client()  
        {  
            //nothing to do..just create to object      
        }  

        public POP3client(string pop_server,string user_name,string password)  
        {  
            //put the specied server (pop_server), user (user_name) and password (password)  
            //into the appropriate properties.  
            pop=pop_server;  
            user=user_name;  
            pwd=password;  
        }  

        #region Utility Methods, some public, some private  
        public string connect (string pop_server)  
        {  
            pop=pop_server;    //put the specified server into the pop property  
            return(connect()); //call the connect method  
        }  
        public string connect()  
        {  
            //Initialize to the pop server.  This code snipped "borrowed"  
            //with some modifications...  
            //from the article "Retrieve Mail From a POP3 Server Using C#" at  
            //www.codeproject.com by Agus Kurniawan  
            //http://www.codeproject.com/csharp/popapp.asp   

            // create server with port 110  
            Server = new TcpClient(pop,110);                                  
          
            try  
            {  
                // initialization  
                NetStrm = Server.GetStream();  
                RdStrm= new StreamReader(Server.GetStream());  

                //The pop session is now in the AUTHORIZATION state  
                state=connect_state.AUTHORIZATION ;  
                return(RdStrm.ReadLine ());  
            }              
            catch(InvalidOperationException err)  
            {  
                return("Error: "+err.ToString());  
            }  

        }  
        private string disconnect ()  
        {  
            string temp="disconnected successfully.";  
            if(state !=connect_state.disc)  
            {  

                //close connection  
                NetStrm.Close();  
                RdStrm.Close();  
                state=connect_state.disc ;  
            }  
            else  
            {  
                temp="Not Connected.";  
            }  
            return(temp);  
        }  

        private void issue_command(string command)  
        {  
            //send the command to the pop server.  This code snipped "borrowed"  
            //with some modifications...  
            //from the article "Retrieve Mail From a POP3 Server Using C#" at  
            //www.codeproject.com by Agus Kurniawan  
            //http://www.codeproject.com/csharp/popapp.asp   
            Data= command + CRLF;  
            szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());  
            NetStrm.Write(szData,0,szData.Length);  

        }  
        private string read_single_line_response()  
        {  
            //read the response of the pop server.  This code snipped "borrowed"  
            //with some modifications...  
            //from the article "Retrieve Mail From a POP3 Server Using C#" at  
            //www.codeproject.com by Agus Kurniawan  
            //http://www.codeproject.com/csharp/popapp.asp   
            string temp;  
            try  
            {  
                temp = RdStrm.ReadLine();  
                was_pop_error(temp);                  
                return(temp);  
            }  
            catch(InvalidOperationException err)  
            {  
                return("Error in read_single_line_response(): " + err.ToString ()) ;  
            }  

        }  
        private string read_multi_line_response()  
        {  
            //read the response of the pop server.  This code snipped "borrowed"  
            //with some modifications...  
            //from the article "Retrieve Mail From a POP3 Server Using C#" at  
            //www.codeproject.com by Agus Kurniawan  
            //http://www.codeproject.com/csharp/popapp.asp   
            string temp="";  
            string szTemp;  

            try  
            {  
                szTemp = RdStrm.ReadLine();  
                was_pop_error(szTemp);                  
                if(!error)   
                {  
                  
                    while(szTemp!=".")  
                    {  
                        temp += szTemp+CRLF;  
                        szTemp = RdStrm.ReadLine();  
                    }  
                }  
                else  
                {  
                    temp=szTemp;  
                }  
                return(temp);  
            }  
            catch(InvalidOperationException err)  
            {  
                return("Error in read_multi_line_response(): " + err.ToString ());  
            }  
        }  
        private void was_pop_error(string response)  
        {  
            //detect if the pop server that issued the response believes that  
            //an error has occured.  

            if(response.StartsWith ("-"))  
            {  
                //if the first character of the response is "-" then the   
                //pop server has encountered an error executing the last   
                //command send by the client  
                error=true;  
            }  
            else  
            {  
                //success  
                error=false;  
            }  
        }  
        #endregion  
        #region POP commands  
        public string DELE(int msg_number)  
        {  
            string temp;  
              
            if (state != connect_state.TRANSACTION )  
            {  
                //DELE is only valid when the pop session is in the TRANSACTION STATE  
                temp="Connection state not = TRANSACTION";  
            }  
            else  
            {  
                issue_command("DELE " + msg_number.ToString ());  
                temp=read_single_line_response();              
            }  
            return(temp);  
        }  

        public string LIST()  
        {  
            string temp="";  
            if (state != connect_state.TRANSACTION )  
            {  
                //the pop command LIST is only valid in the TRANSACTION state  
                temp="Connection state not = TRANSACTION";  
            }  
            else  
            {  
                issue_command ("LIST");  
                temp=read_multi_line_response();  
            }  
            return(temp);              
        }  

        public string LIST(int msg_number)  
        {  
            string temp="";  

            if (state != connect_state.TRANSACTION )  
            {  
                //the pop command LIST is only valid in the TRANSACTION state  
                temp="Connection state not = TRANSACTION";  
            }  
            else  
            {  
                issue_command ("LIST " + msg_number.ToString ());  
                temp=read_single_line_response();  //when the message number is supplied, expect a single line response  
            }  
            return(temp);  

        }  

        public string NOOP()  
        {  
            string temp;  
            if (state != connect_state.TRANSACTION )  
            {  
                //the pop command NOOP is only valid in the TRANSACTION state  
                temp="Connection state not = TRANSACTION";  
            }  
            else  
            {  
                issue_command ("NOOP");  
                temp=read_single_line_response();  

            }  
            return(temp);  

        }  
        public string PASS()  
        {  
            string temp;  
            if (state != connect_state.AUTHORIZATION)   
            {  
                //the pop command PASS is only valid in the AUTHORIZATION state  
                temp="Connection state not = AUTHORIZATION";  
            }  
            else  
            {  
                if (pwd !=null)  
                {  
                    issue_command ("PASS " + pwd);  
                    temp=read_single_line_response();  

                    if (!error)  
                    {  
                        //transition to the Transaction state  
                        state=connect_state.TRANSACTION;  
                    }  
                }  
                else  
                {  
                    temp="No Password set.";  
                }  
            }  
            return(temp);  
        }  
        public string PASS(string password)  
        {  
            pwd=password;   //put the supplied password into the appropriate property  
            return(PASS()); //call PASS() with no arguement  
        }  

        public string QUIT()  
        {  
            //QUIT is valid in all pop states  

            string temp;  
            if (state !=connect_state.disc)  
            {  
                issue_command ("QUIT");  
                temp=read_single_line_response();  
                temp += CRLF + disconnect();  
      
            }  
            else  
            {  
                temp="Not Connected.";  
            }  
            return(temp);  

        }  
        public string RETR (int msg)  
        {  
            string temp="";  
            if (state != connect_state.TRANSACTION )  
            {  
                //the pop command RETR is only valid in the TRANSACTION state  
                temp="Connection state not = TRANSACTION";  
            }  
            else  
            {  
                // retrieve mail with number mail parameter  
                issue_command ("RETR "+ msg.ToString ());  
                temp=read_multi_line_response();  
            }  
            return(temp);  

        }  

        public string RSET()  
        {  
            string temp;  
            if (state != connect_state.TRANSACTION )  
            {  
                //the pop command STAT is only valid in the TRANSACTION state  
                temp="Connection state not = TRANSACTION";  
            }  
            else  
            {  
                issue_command("RSET");  
                temp=read_single_line_response();  
            }  
            return(temp);  

        }  

        public string STAT()  
        {  
            string temp;  
            if (state==connect_state.TRANSACTION)  
            {  
                issue_command("STAT");  
                temp=read_single_line_response();  

                return(temp);  
            }  
            else  

            {  
                //the pop command STAT is only valid in the TRANSACTION state  
                return ("Connection state not = TRANSACTION");  
            }  
        }          

        public string USER()  
        {  
            string temp;  
            if (state != connect_state.AUTHORIZATION)   
            {  
                //the pop command USER is only valid in the AUTHORIZATION state  
                temp="Connection state not = AUTHORIZATION";  
            }  
            else  
            {  
                if (user !=null)  
                {     
                    issue_command("USER "+ user);  
                    temp=read_single_line_response();  
                }  
                else  
                {   //no user has been specified  
                    temp="No User specified.";  
                }  
            }  
            return(temp);  
        }  

        public string USER(string user_name)  
        {  
            user=user_name;  //put the user name in the appropriate propertity  
            return(USER());  //call USER with no arguements  
        }  
        #endregion  
    }  

}  

posted on 2004-08-07 07:26  LiShijin.Net  阅读(535)  评论(0编辑  收藏  举报

导航