using System; using System.Collections; using System.Net; using System.Net.Sockets; using System.IO; using System.Threading; namespace Coolcat.De { /// /// Simple session /// public class SmtpSession { Socket _socket; private string _sessionProtocol=""; /// /// session protocol /// public string SessionProtocol { get { return _sessionProtocol; } set { _sessionProtocol = value; } } /// /// process session /// public void Process () { NetworkStream networkStream = new NetworkStream(_socket); StreamWriter streamWriter = new StreamWriter(networkStream); StreamReader streamReader = new StreamReader(networkStream); streamWriter.AutoFlush = true; try { streamWriter.WriteLine ("220 coolcat.de SMTP Mock Server Ready"); bool datasent = false; while (_socket.Connected == true) { string line = streamReader.ReadLine(); _sessionProtocol += line + "\n"; if (line == String.Empty) continue; if (line.ToUpper().StartsWith ("QUIT")) { streamWriter.WriteLine("221 coolcat.de Service closing transmission channel"); break; } if (line.ToUpper().StartsWith ("DATA")) { datasent=true; streamWriter.WriteLine("354 Immediate Reply"); } else if (datasent && line.Trim() == ".") { datasent=false; streamWriter.WriteLine ("250 OK"); } else if (!datasent) { streamWriter.WriteLine("250 OK"); } } } catch (SocketException socketException) { Console.WriteLine (socketException.Message); } finally { streamReader.Close(); streamWriter.Close (); networkStream.Close (); _socket.Close (); } } /// /// constructor /// /// public SmtpSession (Socket socket) { _socket = socket; } } /// /// Simple SMTP Mock server /// public class SmtpMock { private TcpListener _smtpListener = null; private ArrayList _sessions = new ArrayList (); /// /// list of all smtp sessions /// public SmtpSession[] Sessions { get { return (SmtpSession[]) _sessions.ToArray(typeof (SmtpSession)); } } /// /// start server /// public void Start () { Thread smtpServerThread = new Thread (new ThreadStart (Run)); smtpServerThread.Start (); } /// /// stop server /// public void Stop () { if (_smtpListener != null) _smtpListener.Stop (); } /// /// run server /// private void Run () { _smtpListener = new TcpListener (IPAddress.Any, 25); // open listener for port _smtpListener.Start (); try { while (true) { Socket clientSocket = _smtpListener.AcceptSocket (); SmtpSession session = new SmtpSession (clientSocket); _sessions.Add (session); Thread sessionThread = new Thread (new ThreadStart (session.Process)); sessionThread.Start (); /*sessionThread.Join (); // remove comment for more sessions at the same time*/ } } catch (InvalidOperationException) {} finally { _smtpListener.Stop(); } } } }