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"); }
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); } }
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); }