OSS SMTP & POP3 Server Component for .NET April, 2010
Found a great OSS .NET SMTP & POP3 server component today by Eric Daugherty. The last release was about 6 years ago so I created a VS2010 solution for it and compiled it to .NET 3.5: cses.zip
It's really simple to use and even comes with a "simple server" (Not recommended for production but worked for my purposes). Here is a simple wrapper I created for a project I'm working on:
using System; using System.Linq; using System.Net.Mail; using EricDaugherty.CSES.Net; using EricDaugherty.CSES.SmtpServer; namespace CruiseNotificationInterceptor { public class SmtpServer { private SimpleServer _server; private SMTPProcessor _processor; public SmtpServer(int port, Action<MailMessage> messageHandler) { _processor = new SMTPProcessor( Environment.MachineName, new AllRecipientFilter(), new MessageSpoolProxy(messageHandler)); _server = new SimpleServer(port, _processor.ProcessConnection); } public void Start() { _server.Start(); } public void Stop() { _server.Stop(); } private class MessageSpoolProxy : IMessageSpool { private Action<MailMessage> _handleMessage; public MessageSpoolProxy(Action<MailMessage> messageHandler) { _handleMessage = messageHandler; } public bool SpoolMessage(SMTPMessage message) { var netMessage = new MailMessage { From = new MailAddress(message.FromAddress.Address) }; foreach (var address in message.ToAddresses) netMessage.To.Add(new MailAddress(address.Address)); foreach (var key in message.Headers.Keys.Cast<string>()) netMessage.Headers[key] = message.Headers[key].ToString(); if (message.Headers.ContainsKey("Subject")) netMessage.Subject = message.Headers["Subject"].ToString(); if (message.Headers.ContainsKey("Sender")) netMessage.Sender = new MailAddress(message.Headers["Sender"].ToString()); if (message.Headers.ContainsKey("Reply-To")) netMessage.ReplyToList.Add(new MailAddress(message.Headers["Reply-To"].ToString())); var data = message.Data.Split(new[] {"\r\n\r\n"}, 2, StringSplitOptions.None); if (data.Length == 2) netMessage.Body = data[1]; if (netMessage.Body.EndsWith("\r\n\r\n")) netMessage.Body = netMessage.Body.Substring(0, netMessage.Body.Length - 4); _handleMessage(netMessage); return true; } } private class AllRecipientFilter : IRecipientFilter { public bool AcceptRecipient(SMTPContext context, EricDaugherty.CSES.Common.EmailAddress recipient) { return true; } } } }
Thanks Eric!