예제 #1
0
        public void TestExecuteFail()
        {
            using (ShimsContext.Create())
            {
                var server      = new ShimSMTPServer();
                var settings    = new StubIReceiveSettings();
                var transaction = new SMTPTransaction(server, settings);

                server.GetHandlerString = s => null;

                var response = transaction.ExecuteCommand(new SMTPCommand("NonExistentCommand", "Params"));

                Assert.Equal(SMTPStatusCode.SyntaxError, response.Code);
            }
        }
예제 #2
0
        public void TestExecuteSuccess()
        {
            const string command          = "Test";
            var          expectedResponse = new SMTPResponse(SMTPStatusCode.NotAvailiable, "Fu", "bar");
            const string expectedParams   = "Fubar blubb";

            using (ShimsContext.Create())
            {
                var server      = new ShimSMTPServer();
                var settings    = new StubIReceiveSettings();
                var transaction = new SMTPTransaction(server, settings);

                SMTPTransaction actualTransaction = null;
                string          actualParams      = null;

                var handler = new StubICommandHandler
                {
                    ExecuteSMTPTransactionString = (smtpTransaction, s) =>
                    {
                        actualTransaction = smtpTransaction;
                        actualParams      = s;

                        return(expectedResponse);
                    }
                };

                server.GetHandlerString = s =>
                {
                    if (s.Equals(command, StringComparison.InvariantCultureIgnoreCase))
                    {
                        return(handler);
                    }
                    throw new InvalidOperationException("Invalid name.");
                };

                var response = transaction.ExecuteCommand(new SMTPCommand(command, expectedParams));

                Assert.Same(expectedResponse, response);
                Assert.Equal(expectedParams, actualParams);
                Assert.Same(transaction, actualTransaction);
            }
        }
예제 #3
0
        public async Task Process()
        {
            try
            {
                Log(LogEventType.Connect);

                SMTPResponse response;
                _transaction = _smtpServer.SMTPServer.StartTransaction(_remoteEndpoint.Address, _smtpServer.Settings,
                                                                       out response);

                if (_tlsConnector.Settings.Mode == TLSMode.FullTunnel)
                {
                    await StartTLS();
                }

                RefreshReaderAndWriter();

                _transaction.OnStartTLS += OnStartTLS;
                _transaction.OnClose    += OnCloseHandler;

                await Write(response);

                try
                {
                    while (!_reader.EndOfStream && !_transaction.Closed)
                    {
                        await Write(_transaction.ExecuteCommand(await Read()));

                        while (_transaction.InDataMode)
                        {
                            string line;
                            var    data = new StringBuilder();

                            do
                            {
                                line = await _reader.ReadLineAsync();
                            } while (_transaction.HandleDataLine(line, data));

                            await Write(_transaction.HandleData(data.ToString()));
                        }

                        if (_startTLS)
                        {
                            await StartTLS();

                            RefreshReaderAndWriter();
                            RefreshTransaction();

                            _startTLS = false;
                        }
                    }
                }
                catch (IOException)
                {
                }
            }
            catch (Exception e)
            {
                Logger.Error("Error while handling client connection.", e);
            }
            finally
            {
                Close();
            }
        }