void Session_MessageReceived(object sender, MessageEventArgs e) { // Save the message in the preset pickup directory // ensure we can write FileIOPermission permission = new FileIOPermission(FileIOPermissionAccess.Write, DumpPath); permission.Assert(); StreamWriter file = File.AppendText(DumpPath); try { file.Write(_LineTerminator + "---------------START OF MESSAGE-------------------" + _LineTerminator); file.Write("Message Id: " + e.MessageId + _LineTerminator); file.Write(_LineTerminator + "From: " + e.From + _LineTerminator); file.Write("To: " + e.ToAsList() + _LineTerminator); file.Write(_LineTerminator + "Subject: " + e.Subject + _LineTerminator); file.Write("Data: " + e.Data + _LineTerminator); file.Write(_LineTerminator + "---------------END OF MESSAGE---------------------" + _LineTerminator); file.Close(); SetStatus(String.Format("Recieved: {0}", e.Subject)); } finally { file.Close(); } }
/// <summary> /// Connect and check incomming data /// </summary> public void Connect() { _Status = StatusEnum.Connected; if (this.Connected != null) { this.Connected(this, new EventArgs()); } MessageEventArgs message = null; try { _Socket = _Listener.AcceptSocket(); _NetworkStream = new NetworkStream(_Socket, FileAccess.ReadWrite, true); WriteLine( string.Format( "220 Welcome {0}, LOCALHOST-SMTP:", ((IPEndPoint)_Socket.RemoteEndPoint).Address)); while (_Socket.Connected) { string data = this.Read(_LineTerminator); if (data == null) { break; } else { if (data.StartsWith("QUIT", StringComparison.InvariantCultureIgnoreCase)) { Disconnect(); } else if (data.StartsWith("EHLO", StringComparison.InvariantCultureIgnoreCase) || data.StartsWith("HELO", StringComparison.InvariantCultureIgnoreCase)) { this.WriteGreeting(data.Substring(4).Trim()); _Status = StatusEnum.Identified; } else if (_Status < StatusEnum.Identified) { this.WriteError(ErrorEnum.BadCommandSequence, "Expected HELO <Your Name>"); } else { if (data.StartsWith("MAIL", StringComparison.InvariantCultureIgnoreCase)) { if (_Status != StatusEnum.Identified && _Status != StatusEnum.Data) { this.WriteError(ErrorEnum.BadCommandSequence, "Command out of sequence"); } else { // create a new message message = new MessageEventArgs(); message.From = TextFunctions.Tail(data, ":"); _Status = StatusEnum.Mail; this.WriteOk(); } } else if (data.StartsWith("RCPT", StringComparison.InvariantCultureIgnoreCase)) { if (_Status != StatusEnum.Mail && _Status != StatusEnum.Recipient) { this.WriteError(ErrorEnum.BadCommandSequence, "Command out of sequence"); } else { message.To.Add(TextFunctions.Tail(data, ":")); _Status = StatusEnum.Recipient; this.WriteOk(); } } else if (data.StartsWith("DATA", StringComparison.InvariantCultureIgnoreCase)) { // request data this.WriteSendData(); message.Data = this.Read(_DataTerminator); // raise event if (this.MessageReceived != null) { this.MessageReceived(this, message); message = null; } _Status = StatusEnum.Data; this.WriteOk(); } else { this.WriteError(ErrorEnum.CommandNotImplemented, "Command not implemented"); } } } } } catch (Exception ex) { Trace.Write(ex); Disconnect(); } }