--- /dev/null
+//
+// SmtpServer.cs - Dummy SMTP server used to test SmtpClient
+//
+// Author:
+// Raja R Harinath <harinath@hurrynot.org>
+//
+
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Net;
+using System.Net.Mail;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading;
+
+namespace MonoTests.System.Net.Mail {
+ public class SmtpServer
+ {
+ public string mail_from, rcpt_to;
+ public StringBuilder data;
+
+ TcpListener server;
+ public IPEndPoint EndPoint {
+ get { return (IPEndPoint) server.LocalEndpoint; }
+ }
+
+ public SmtpServer ()
+ {
+ server = new TcpListener (0);
+ server.Start (1);
+ }
+
+ private static void WriteNS (NetworkStream ns, string s)
+ {
+ Trace ("response", s);
+ byte [] bytes = Encoding.ASCII.GetBytes (s);
+ ns.Write (bytes, 0, bytes.Length);
+ }
+
+ public void Run ()
+ {
+ string s;
+ using (TcpClient client = server.AcceptTcpClient ()) {
+ Trace ("connection", EndPoint.Port);
+ using (NetworkStream ns = client.GetStream ()) {
+ WriteNS (ns, "220 localhost\r\n");
+ using (StreamReader r = new StreamReader (ns, Encoding.UTF8)) {
+ while ((s = r.ReadLine ()) != null && Dispatch (ns, r, s))
+ ;
+ }
+ }
+ }
+ }
+
+ // return false == terminate
+ public bool Dispatch (NetworkStream ns, StreamReader r, string s)
+ {
+ Trace ("command", s);
+ if (s.Length < 4) {
+ WriteNS (ns, "502 Huh\r\n");
+ return false;
+ }
+
+ bool retval = true;
+ switch (s.Substring (0, 4)) {
+ case "HELO":
+ break;
+ case "QUIT":
+ WriteNS (ns, "221 Quit\r\n");
+ return false;
+ case "MAIL":
+ mail_from = s.Substring (10);
+ break;
+ case "RCPT":
+ rcpt_to = s.Substring (8);
+ break;
+ case "DATA":
+ WriteNS (ns, "354 Continue\r\n");
+ data = new StringBuilder ();
+ while ((s = r.ReadLine ()) != null) {
+ if (s == ".")
+ break;
+ data.AppendLine (s);
+ }
+ Trace ("end of data", s);
+ retval = (s != null);
+ break;
+ default:
+ WriteNS (ns, "502 Huh\r\n");
+ return true;
+ }
+
+ WriteNS (ns, "250 OK\r\n");
+ return retval;
+ }
+
+ [Conditional ("TEST")]
+ static void Trace (string key, object value)
+ {
+ Console.Error.WriteLine ("{0}: {1}", key, value);
+ }
+
+#if TEST
+ static void DoTest (SmtpServer s, SmtpClient c, MailMessage m)
+ {
+ Thread t = new Thread (s.Run);
+ t.Start ();
+ c.Send (m);
+ t.Join ();
+
+ Console.WriteLine ("Message From: {0}", m.From);
+ Console.WriteLine ("Message Sender: {0}", m.Sender);
+ Console.WriteLine ("Mail From: {0}", s.mail_from);
+ Console.WriteLine ("Rcpt To: {0}", s.rcpt_to);
+ Console.WriteLine ("-------------------------------------");
+ Console.Write (s.data);
+ Console.WriteLine ("-------------------------------------");
+ }
+
+ static void Main ()
+ {
+ var server = new SmtpServer ();
+ var client = new SmtpClient ("localhost", server.EndPoint.Port);
+ var msg = new MailMessage ("foo@example.com", "bar@example.com", "hello", "howdydoo");
+
+ DoTest (server, client, msg);
+
+ msg.Sender = new MailAddress ("baz@example.com");
+
+ DoTest (server, client, msg);
+ }
+#endif
+ }
+}