繁体中文
设为首页
加入收藏
当前位置:.Net技术首页 >> Asp.Net开发 >> POP3 Client as a C# Class(转自CodeProject)

POP3 Client as a C# Class(转自CodeProject)

2007-06-15 08:00:00  作者:  来源:互联网  浏览次数:0  文字大小:【】【】【
简介: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_...

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

}

}

//转自CodeProject

责任编辑:admin
相关文章