学院首页>网络编程>ASP.NET>ASP.NET读取POP3邮件的操作

ASP.NET读取POP3邮件的操作

作者:CodeProject 来源:- 添加时间:2006-5-21 10:45:17
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
 }

}
 
站内搜索