public async Task SendMailAsync_CanBeCanceled_CancellationToken()
        {
            using var server        = new LoopbackSmtpServer();
            using SmtpClient client = server.CreateClient();

            server.ReceiveMultipleConnections = true;

            // The server will introduce some fake latency so that the operation can be canceled before the request completes
            ManualResetEvent serverMre = new ManualResetEvent(false);

            server.OnConnected += _ => serverMre.WaitOne();

            CancellationTokenSource cts = new CancellationTokenSource();

            var message = new MailMessage("*****@*****.**", "*****@*****.**", "Foo", "Bar");

            Task sendTask = client.SendMailAsync(message, cts.Token);

            cts.Cancel();
            await Task.Delay(500);

            serverMre.Set();

            await Assert.ThrowsAsync <TaskCanceledException>(async() => await sendTask);

            // We should still be able to send mail on the SmtpClient instance
            await client.SendMailAsync(message);

            Assert.Equal("<*****@*****.**>", server.MailFrom);
            Assert.Equal("<*****@*****.**>", server.MailTo);
            Assert.Equal("Foo", server.Message.Subject);
            Assert.Equal("Bar", server.Message.Body);
            Assert.Equal(GetClientDomain(), server.ClientDomain);
        }
        public async Task SendMail_SendQUITOnDispose(bool asyncSend)
        {
            bool quitMessageReceived = false;

            using ManualResetEventSlim quitReceived = new ManualResetEventSlim();
            using var server       = new LoopbackSmtpServer();
            server.OnQuitReceived += _ =>
            {
                quitMessageReceived = true;
                quitReceived.Set();
            };

            using (SmtpClient client = server.CreateClient())
            {
                client.Credentials = new NetworkCredential("Foo", "Bar");
                MailMessage msg = new MailMessage("*****@*****.**", "*****@*****.**", "hello", "howdydoo");
                if (asyncSend)
                {
                    await client.SendMailAsync(msg).WaitAsync(TimeSpan.FromSeconds(30));
                }
                else
                {
                    client.Send(msg);
                }
                Assert.False(quitMessageReceived, "QUIT received");
            }

            // There is a latency between send/receive.
            quitReceived.Wait(TimeSpan.FromSeconds(30));
            Assert.True(quitMessageReceived, "QUIT message not received");
        }
Example #3
0
        public async Task TestMultipleMailDelivery(bool asyncSend)
        {
            using var server        = new LoopbackSmtpServer();
            using SmtpClient client = server.CreateClient();
            client.Timeout          = 10000;
            client.Credentials      = new NetworkCredential("foo", "bar");
            MailMessage msg = new MailMessage("*****@*****.**", "*****@*****.**", "hello", "howdydoo");

            for (var i = 0; i < 5; i++)
            {
                if (asyncSend)
                {
                    using var cts = new CancellationTokenSource(10000);
                    await client.SendMailAsync(msg, cts.Token);
                }
                else
                {
                    client.Send(msg);
                }

                Assert.Equal("<*****@*****.**>", server.MailFrom);
                Assert.Equal("<*****@*****.**>", server.MailTo);
                Assert.Equal("hello", server.Message.Subject);
                Assert.Equal("howdydoo", server.Message.Body);
                Assert.Equal(GetClientDomain(), server.ClientDomain);
                Assert.Equal("foo", server.Username);
                Assert.Equal("bar", server.Password);
                Assert.Equal("LOGIN", server.AuthMethodUsed, StringComparer.OrdinalIgnoreCase);
            }
        }
Example #4
0
        public void TestGssapiAuthentication()
        {
            using var server = new LoopbackSmtpServer();
            server.AdvertiseGssapiAuthSupport = true;
            server.ExpectedGssapiCredential   = new NetworkCredential("foo", "bar");
            using SmtpClient client           = server.CreateClient();
            client.Credentials = server.ExpectedGssapiCredential;
            MailMessage msg = new MailMessage("*****@*****.**", "*****@*****.**", "hello", "howdydoo");

            client.Send(msg);

            Assert.Equal("GSSAPI", server.AuthMethodUsed, StringComparer.OrdinalIgnoreCase);
        }
        [ActiveIssue("https://github.com/dotnet/runtime/issues/131", TestRuntimes.Mono)] // System.Net.Tests are flaky and/or long running
        public async Task TestMailDeliveryAsync(string body)
        {
            using var server        = new LoopbackSmtpServer();
            using SmtpClient client = server.CreateClient();
            MailMessage msg = new MailMessage("*****@*****.**", "*****@*****.**", "hello", body);

            await client.SendMailAsync(msg).WaitAsync(TimeSpan.FromSeconds(30));

            Assert.Equal("<*****@*****.**>", server.MailFrom);
            Assert.Equal("<*****@*****.**>", server.MailTo);
            Assert.Equal("hello", server.Message.Subject);
            Assert.Equal(body ?? "", server.Message.Body);
            Assert.Equal(GetClientDomain(), server.ClientDomain);
        }
        public void SendMailAsync_CanBeCanceled_CancellationToken_SetAlready()
        {
            using var server        = new LoopbackSmtpServer();
            using SmtpClient client = server.CreateClient();

            CancellationTokenSource cts = new CancellationTokenSource();

            cts.Cancel();

            var message = new MailMessage("*****@*****.**", "*****@*****.**", "Foo", "Bar");

            Task sendTask = client.SendMailAsync(message, cts.Token);

            // Tests an implementation detail - if a CT is already set a canceled task will be returned
            Assert.True(sendTask.IsCanceled);
        }
        [InlineData(true, true, true)]  // Received subjectBase64. If subjectText is received, the test fails, and the results are inconsistent with those of synchronous methods.
        public void SendMail_DeliveryFormat_SubjectEncoded(bool useAsyncSend, bool useSevenBit, bool useSmtpUTF8)
        {
            // If the server support `SMTPUTF8` and use `SmtpDeliveryFormat.International`, the server should received this subject.
            const string subjectText = "Test \u6d4b\u8bd5 Contain \u5305\u542b UTF8";

            // If the server does not support `SMTPUTF8` or use `SmtpDeliveryFormat.SevenBit`, the server should received this subject.
            const string subjectBase64 = "=?utf-8?B?VGVzdCDmtYvor5UgQ29udGFpbiDljIXlkKsgVVRGOA==?=";

            using var server        = new LoopbackSmtpServer();
            using SmtpClient client = server.CreateClient();

            // Setting up Server Support for `SMTPUTF8`.
            server.SupportSmtpUTF8 = useSmtpUTF8;

            if (useSevenBit)
            {
                // Subject will be encoded by Base64.
                client.DeliveryFormat = SmtpDeliveryFormat.SevenBit;
            }
            else
            {
                // If the server supports `SMTPUTF8`, subject will not be encoded. Otherwise, subject will be encoded by Base64.
                client.DeliveryFormat = SmtpDeliveryFormat.International;
            }

            MailMessage msg = new MailMessage("*****@*****.**", "*****@*****.**", subjectText, "hello \u9ad8\u575a\u679c");

            msg.HeadersEncoding = msg.BodyEncoding = msg.SubjectEncoding = System.Text.Encoding.UTF8;

            if (useAsyncSend)
            {
                client.SendMailAsync(msg).Wait();
            }
            else
            {
                client.Send(msg);
            }

            if (useSevenBit || !useSmtpUTF8)
            {
                Assert.Equal(subjectBase64, server.Message.Subject);
            }
            else
            {
                Assert.Equal(subjectText, server.Message.Subject);
            }
        }
        [ActiveIssue("https://github.com/dotnet/runtime/issues/131", TestRuntimes.Mono)] // System.Net.Tests are flaky and/or long running
        public async Task TestCredentialsCopyInAsyncContext()
        {
            using var server        = new LoopbackSmtpServer();
            using SmtpClient client = server.CreateClient();
            MailMessage msg = new MailMessage("*****@*****.**", "*****@*****.**", "hello", "howdydoo");

            CredentialCache cache = new CredentialCache();

            cache.Add("localhost", server.Port, "NTLM", CredentialCache.DefaultNetworkCredentials);

            client.Credentials = cache;

            // The mock server doesn't actually understand NTLM, but still advertises support for it
            server.AdvertiseNtlmAuthSupport = true;
            await Assert.ThrowsAsync <SmtpException>(async() => await client.SendMailAsync(msg));

            Assert.Equal("NTLM", server.AuthMethodUsed, StringComparer.OrdinalIgnoreCase);
        }
        public void TestMailDelivery()
        {
            using var server        = new LoopbackSmtpServer();
            using SmtpClient client = server.CreateClient();
            client.Credentials      = new NetworkCredential("foo", "bar");
            MailMessage msg = new MailMessage("*****@*****.**", "*****@*****.**", "hello", "howdydoo");

            client.Send(msg);

            Assert.Equal("<*****@*****.**>", server.MailFrom);
            Assert.Equal("<*****@*****.**>", server.MailTo);
            Assert.Equal("hello", server.Message.Subject);
            Assert.Equal("howdydoo", server.Message.Body);
            Assert.Equal(GetClientDomain(), server.ClientDomain);
            Assert.Equal("foo", server.Username);
            Assert.Equal("bar", server.Password);
            Assert.Equal("LOGIN", server.AuthMethodUsed, StringComparer.OrdinalIgnoreCase);
        }