public SMTPImpostorMessageReceivedEvent(
     SMTPImpostorHostSettings hostSettings,
     SMTPImpostorMessage message) :
     base(hostSettings.Id, message.Id, message)
 {
     HostSettings = hostSettings;
 }
예제 #2
0
 public ISMTPImpostorHost CreateHost(
     SMTPImpostorHostSettings settings)
 {
     return(new SMTPImpostorHost(
                _loggerFactory.CreateLogger <SMTPImpostorHost>(),
                settings,
                _storeProviders[settings.StoreType ?? _settings.DefaultStoreType].Create(settings.Id, settings.Store)
                ));
 }
예제 #3
0
        ISMTPImpostorHost GetSMTPImpostorHost(
            SMTPImpostorHostSettings hostSettings)
        {
            var services = new ServiceCollection()
                .AddLogging()
                .AddSMTPImpostor()
                .AddSMTPImpostorInMemoryMessagesStore()
                .BuildServiceProvider();

            var hostProvider = services.GetRequiredService<ISMTPImpostorHostProvider>();
            var host = hostProvider.CreateHost(hostSettings);
            host.Start();

            return host;
        }
예제 #4
0
        public ISMTPImpostorHost AddHost(SMTPImpostorHostSettings hostSettings)
        {
            var host = CreateHost(hostSettings);

            Hosts = Hosts.Add(host.Settings.Id, host);
            _events.OnNext(new SMTPImpostorHostAddedEvent(host.Settings.Id));

            host.Events.Subscribe(e => _events.OnNext(e));

            if (hostSettings.Start)
            {
                host.Start();
            }

            return(host);
        }
예제 #5
0
        public SMTPImpostorHost(
            ILogger <SMTPImpostorHost> logger,
            SMTPImpostorHostSettings settings,
            ISMTPImpostorMessagesStore messages)
        {
            _logger = logger ?? NullLogger <SMTPImpostorHost> .Instance;
            _events = new Subject <ISMTPImpostorEvent>();

            Settings = settings ??
                       throw new ArgumentNullException(nameof(settings));
            Messages = messages;
            _messagesSubscription = Messages.Events.Subscribe(e => _events.OnNext(e));

            StoppedEvent   = new SMTPImpostorHostStateChangeEvent(settings.Id, SMTPImpostorHostStatus.Stopped);
            StartedEvent   = new SMTPImpostorHostStateChangeEvent(settings.Id, SMTPImpostorHostStatus.Started);
            ReceivingEvent = new SMTPImpostorHostStateChangeEvent(settings.Id, SMTPImpostorHostStatus.Receiving);
            ErroredEvent   = new SMTPImpostorHostStateChangeEvent(settings.Id, SMTPImpostorHostStatus.Errored);

            RaiseStateChange(StoppedEvent);
        }
예제 #6
0
        public ISMTPImpostorHost UpdateHost(Guid hostId, SMTPImpostorHostSettings hostSettings)
        {
            var host = Hosts[hostId];

            Hosts = Hosts.Remove(hostId);
            host.Dispose();

            host = CreateHost(hostSettings);

            Hosts = Hosts.Add(hostId, host);
            _events.OnNext(new SMTPImpostorHostUpdatedEvent(hostId));

            host.Events.Subscribe(e => _events.OnNext(e));
            if (hostSettings.Start)
            {
                Delegates.Retry(
                    () => host.Start(),
                    _logger);
            }

            return(host);
        }
예제 #7
0
        public void messages_max()
        {
            var max = 2;
            var hostSettings = new SMTPImpostorHostSettings(
                      ip: "127.0.0.1",
                      port: 52525,
                      store: new SMTPImpostorMessagesStoreSettings(
                          maxMessages: 2
                          ));

            var messages = new List<SMTPImpostorMessage>();
            using var host = GetSMTPImpostorHost(hostSettings);
            using var events = host.Events
                    .OfType<SMTPImpostorMessageReceivedEvent>()
                    .Subscribe(e => messages.Add(e.Data));

            using var client = new SmtpClient(hostSettings.IP, hostSettings.Port);

            for (var i = 0; i < 3; i++)
            {
                using var mailMessage = new MailMessage
                {
                    From = new MailAddress("*****@*****.**"),
                    Subject = $"SUBJECT {i}"
                };

                mailMessage.To.Add("*****@*****.**");
                mailMessage.Body = "SOME CONTENT\nSOME CONTENT\nSOME CONTENT\nSOME CONTENT\n";

                client.Send(mailMessage);
            }

            Assert.AreEqual(max, messages.Count());
            Assert.AreEqual("SUBJECT 2", messages[0].Subject);
            Assert.AreEqual("SUBJECT 3", messages[1].Subject);
        }
예제 #8
0
        public void receives()
        {
            var hostSettings = new SMTPImpostorHostSettings(
                      ip: "127.0.0.1",
                      port: 52525);

            var expectedCount = 10;

            var messages = new List<SMTPImpostorMessage>();
            using var host = GetSMTPImpostorHost(hostSettings);
            using var events = host.Events
                    .OfType<SMTPImpostorMessageReceivedEvent>()
                    .Subscribe(e => messages.Add(e.Data));

            using var client = new SmtpClient(hostSettings.IP, hostSettings.Port);
            using var mailMessage = new MailMessage
            {
                From = new MailAddress("*****@*****.**"),
                Subject = "SUBJECT"
            };

            mailMessage.To.Add("*****@*****.**");
            mailMessage.CC.Add("*****@*****.**");
            mailMessage.CC.Add("*****@*****.**");

            //mailMessage.Body = TestResources.HTML_EMAIL;
            //mailMessage.IsBodyHtml = true;

            mailMessage.Body = "SOME CONTENT\nSOME CONTENT\nSOME CONTENT\nSOME CONTENT\n";

            var alternate = AlternateView.CreateAlternateViewFromString(
                TestResources.HTML_EMAIL,
                new ContentType("text/html"));
            mailMessage.AlternateViews.Add(alternate);

            var buffer = new byte[100 * 1000];
            for (var i = 0; i < buffer.Length; i++)
                buffer[i] = 0;

            using (var stream = new MemoryStream(buffer))
            {
                mailMessage.Attachments.Add(new Attachment(
                    stream, new ContentType("application/app")
                    ));

                for (var i = 0; i < expectedCount; i++)
                    client.Send(mailMessage);
            }

            Assert.AreEqual(expectedCount, messages.Count());

            var message = messages[1];

            Assert.IsFalse(string.IsNullOrWhiteSpace(message.Id));
            Assert.AreNotEqual(0, message.Headers);
            Assert.IsFalse(string.IsNullOrWhiteSpace(message.Subject));
            Assert.IsNotNull(message.From);
            Assert.AreEqual(1, message.To.Count);
            Assert.AreEqual(2, message.Cc.Count);
            Assert.IsFalse(string.IsNullOrWhiteSpace(message.Content));

            Console.WriteLine("===== HEADERS =====");
            Console.WriteLine(string.Join("\n", message.Headers));

            Console.WriteLine("===== CONTENT =====");
            Console.WriteLine(message.Content);
        }