/pop3/Pop3Client.cs
C# | 367 lines | 261 code | 77 blank | 29 comment | 21 complexity | 5a3b96174a190798ddba33eca0dc0384 MD5 | raw file
- 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 long InboxPosition
- {
- get
- {
- return this.m_pop3Message.InboxPosition;
- }
- }
-
- public string ContentType
- {
- get { return m_pop3Message.ContentType; }
- }
-
-
- public string From
- {
- get { return m_pop3Message.From; }
- }
-
- public string To
- {
- get { return m_pop3Message.To; }
- }
-
- public DateTime Date
- {
- get { return m_pop3Message.Date; }
- }
-
- 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");
- if (m_socket != null)
- {
- m_socket.Close();
- 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();
- }
- }
- }