Esempio n. 1
0
        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(); }
        }
Esempio n. 2
0
        /// <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();
            }
        }