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();
}
}
}
}