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
}
}