using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.IO; using sharpknife.Utils; namespace sharpknife.Data { public class PopClient { public string Host { get; set; } public int Port { get; set; } public string Username { get; set; } public string Password { get; set; } private List Status = new List(); public int Messages = 0; public PopClient(string host, int port, string username, string password) { this.Host = host; this.Port = port; this.Username = username; this.Password = password; } public void Connect() { Server = new TcpClient(Host, Port); Status.Clear(); try { // initialization NetStrm = Server.GetStream(); RdStrm = new StreamReader(Server.GetStream()); Status.Add(RdStrm.ReadLine()); // Login Process Data = "USER " + Username + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray()); NetStrm.Write(szData, 0, szData.Length); Status.Add(RdStrm.ReadLine()); Data = "PASS " + Password + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray()); NetStrm.Write(szData, 0, szData.Length); Status.Add(RdStrm.ReadLine()); // Send STAT command to get information ie: number of mail and size Data = "STAT" + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray()); NetStrm.Write(szData, 0, szData.Length); string response = RdStrm.ReadLine(); Status.Add(response); if (StringUtils.Contains(response, "+OK")) { //string messages = StringUtils.GetToken(response, "+OK {} 2392"); //string[] messages = StringUtils.GetTokens(response, "+OK {} {}"); Messages = int.Parse(StringUtils.GetTokens(response, "+OK {} {}")[0]); } } catch (InvalidOperationException err) { Status.Add("Error: " + err.ToString()); } } public void Disconnect() { // Send QUIT command to close session from POP server Data = "QUIT" + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray()); NetStrm.Write(szData, 0, szData.Length); Status.Add(RdStrm.ReadLine()); //close connection NetStrm.Close(); RdStrm.Close(); } public void Delete(int mailNumber) { Data = "DELE " + mailNumber + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray()); NetStrm.Write(szData, 0, szData.Length); string response = RdStrm.ReadLine(); Status.Add(response); if (!StringUtils.Contains(response, "+OK")) { //TODO write exception } } public string Retrieve(int mailNumber) { string message = string.Empty; string szTemp; try { // retrieve mail with number mail parameter Data = "RETR " + mailNumber + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray()); NetStrm.Write(szData, 0, szData.Length); szTemp = RdStrm.ReadLine(); if (szTemp[0] != '-') { while (szTemp != ".") { message += szTemp + CRLF; szTemp = RdStrm.ReadLine(); } } else { Status.Add(szTemp); } } catch (InvalidOperationException err) { Status.Add("Error: " + err.ToString()); } return message; } public TcpClient Server; public NetworkStream NetStrm; public StreamReader RdStrm; public string Data; public byte[] szData; public string CRLF = "\r\n"; } }