www.pudn.com > despop3client_demo.zip > Pop3Client.cs
using System;
using System.Collections;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;
using System.Text.RegularExpressions;
using System.Diagnostics;
namespace Pop3
{
public class Pop3Client
{
private Pop3Credential m_credential;
private const int m_pop3port = 110;
private const int MAX_BUFFER_READ_SIZE = 256;
private long m_inboxPosition = 0;
private long m_directPosition = -1;
private Socket m_socket = null;
private Pop3Message m_pop3Message = null;
public Pop3Credential UserDetails
{
set { m_credential = value; }
get { return m_credential; }
}
public string From
{
get { return m_pop3Message.From; }
}
public string To
{
get { return m_pop3Message.To; }
}
public string Subject
{
get { return m_pop3Message.Subject; }
}
public string Body
{
get { return m_pop3Message.Body; }
}
public IEnumerator MultipartEnumerator
{
get { return m_pop3Message.MultipartEnumerator; }
}
public bool IsMultipart
{
get { return m_pop3Message.IsMultipart; }
}
public Pop3Client(string user, string pass, string server)
{
m_credential = new Pop3Credential(user,pass,server);
}
private Socket GetClientSocket()
{
Socket s = null;
try
{
IPHostEntry hostEntry = null;
// Get host related information.
hostEntry = Dns.Resolve(m_credential.Server);
// Loop through the AddressList to obtain the supported
// AddressFamily. This is to avoid an exception that
// occurs when the host IP Address is not compatible
// with the address family
// (typical in the IPv6 case).
foreach(IPAddress address in hostEntry.AddressList)
{
IPEndPoint ipe = new IPEndPoint(address, m_pop3port);
Socket tempSocket =
new Socket(ipe.AddressFamily,
SocketType.Stream, ProtocolType.Tcp);
tempSocket.Connect(ipe);
if(tempSocket.Connected)
{
// we have a connection.
// return this socket ...
s = tempSocket;
break;
}
else
{
continue;
}
}
}
catch(Exception e)
{
throw new Pop3ConnectException(e.ToString());
}
// throw exception if can't connect ...
if(s == null)
{
throw new Pop3ConnectException("Error : connecting to "
+m_credential.Server);
}
return s;
}
//send the data to server
private void Send(String data)
{
if(m_socket == null)
{
throw new Pop3MessageException("Pop3 connection is closed");
}
try
{
// Convert the string data to byte data
// using ASCII encoding.
byte[] byteData = Encoding.ASCII.GetBytes(data+"\r\n");
// Begin sending the data to the remote device.
m_socket.Send(byteData);
}
catch(Exception e)
{
throw new Pop3SendException(e.ToString());
}
}
private string GetPop3String()
{
if(m_socket == null)
{
throw new
Pop3MessageException("Connection to POP3 server is closed");
}
byte[] buffer = new byte[MAX_BUFFER_READ_SIZE];
string line = null;
try
{
int byteCount =
m_socket.Receive(buffer,buffer.Length,0);
line =
Encoding.ASCII.GetString(buffer, 0, byteCount);
}
catch(Exception e)
{
throw new Pop3ReceiveException(e.ToString());
}
return line;
}
private void LoginToInbox()
{
string returned;
// send username ...
Send("user "+m_credential.User);
// get response ...
returned = GetPop3String();
if( !returned.Substring(0,3).Equals("+OK") )
{
throw new Pop3LoginException("login not excepted");
}
// send password ...
Send("pass "+m_credential.Pass);
// get response ...
returned = GetPop3String();
if( !returned.Substring(0,3).Equals("+OK") )
{
throw new
Pop3LoginException("login/password not accepted");
}
}
public long MessageCount
{
get
{
long count = 0;
if(m_socket==null)
{
throw new Pop3MessageException("Pop3 server not connected");
}
Send("stat");
string returned = GetPop3String();
// if values returned ...
if( Regex.Match(returned,
@"^.*\+OK[ | ]+([0-9]+)[ | ]+.*$").Success )
{
// get number of emails ...
count = long.Parse( Regex
.Replace(returned.Replace("\r\n","")
, @"^.*\+OK[ | ]+([0-9]+)[ | ]+.*$" ,"$1") );
}
return(count);
}
}
public void CloseConnection()
{
Send("quit");
m_socket = null;
m_pop3Message = null;
}
public bool DeleteEmail()
{
bool ret = false;
Send("dele "+m_inboxPosition);
string returned = GetPop3String();
if( Regex.Match(returned,
@"^.*\+OK.*$").Success )
{
ret = true;
}
return ret;
}
public bool NextEmail(long directPosition)
{
bool ret;
if( directPosition >= 0 )
{
m_directPosition = directPosition;
ret = NextEmail();
}
else
{
throw new Pop3MessageException("Position less than zero");
}
return ret;
}
public bool NextEmail()
{
string returned;
long pos;
if(m_directPosition == -1)
{
if(m_inboxPosition == 0)
{
pos = 1;
}
else
{
pos = m_inboxPosition + 1;
}
}
else
{
pos = m_directPosition+1;
m_directPosition = -1;
}
// send username ...
Send("list "+pos.ToString());
// get response ...
returned = GetPop3String();
// if email does not exist at this position
// then return false ...
if( returned.Substring(0,4).Equals("-ERR") )
{
return false;
}
m_inboxPosition = pos;
// strip out CRLF ...
string[] noCr = returned.Split(new char[]{ '\r' });
// get size ...
string[] elements = noCr[0].Split(new char[]{ ' ' });
long size = long.Parse(elements[2]);
// ... else read email data
m_pop3Message = new Pop3Message(m_inboxPosition,size,m_socket);
return true;
}
public void OpenInbox()
{
// get a socket ...
m_socket = GetClientSocket();
// get initial header from POP3 server ...
string header = GetPop3String();
if( !header.Substring(0,3).Equals("+OK") )
{
throw new Exception("Invalid initial POP3 response");
}
// send login details ...
LoginToInbox();
}
}
}