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 = " "; 

    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
  }

}