SmtpClient.SendAsync 不发送电子邮件与 SmtpClient.Send

tas*_*dew 5 c# asynchronous .net-4.0 smtpclient

我正在从事一个项目(不幸的是)需要允许的最大框架为 .NET 4。

在这个项目中,我尝试使用异步发送电子邮件,SendAsync()但由于某种原因,它无法发送(或者更确切地说,它只是不发送)。简而言之,什么都不会发生。没有错误或任何东西,奇怪的是,当我在事件处理程序代码处设置断点并逐步执行程序时,它在任何时候都不会进入事件处理程序。

如果我使用同步方法,Send();它可以完美地工作。

我的代码中唯一的区别是为该方法使用了事件处理程序SendAsync();。( SendCompleteEventHandler)

以下是我迄今为止尝试发送电子邮件的代码。

private static void SendMailAsync()
{

    const string FROM = "testmail@testmail.com";
    const string TO = "recipient@testmail.com";

    string SUBJECT = "THIS IS A TEST";
    string BODY = "THIS IS A TEST";


    const string SMTP_USERNAME = "UserName";  //SMTP username. 
    const string SMTP_PASSWORD = "Password";  // SMTP password.


    const string HOST = "host.testsmtp.com";
    const int PORT = 2587;

    // Create an SMTP client
    SmtpClient client = new SmtpClient(HOST, PORT);
    client.SendCompleted += new SendCompletedEventHandler(Client_SendComplete);

    // Create a network credential
    client.Credentials = new System.Net.NetworkCredential(SMTP_USERNAME, SMTP_PASSWORD);
    client.EnableSsl = true;

    string userToken = "testmsg1";

    // Send the email. 

        client.SendAsync(FROM, TO, SUBJECT, BODY, userToken);

    client.Dispose();

}

private static void Client_SendComplete(object sender, AsyncCompletedEventArgs e)
{
    string token = (string) e.UserState;

    if (e.Error != null)
    {
        MessageBox.Show(e.Error.ToString());
    }
    else
    {
        MessageBox.Show("Message sent.");
    }
}

private void button2_Click(object sender, EventArgs e)
{
    SendMailAsync();
}
Run Code Online (Sandbox Code Playgroud)

有什么我完全失踪的东西吗?谢谢。

VMA*_*Atm 5

asynchronous如果该操作正在asynchronously后台运行,则会调用该操作。因此,您应该将该SendAsync方法视为start for the operation. After this, you're disposing the client which actually run the operation, without waiting for it to complete, so you're, like, saying: hey, start this for me, please... Oh, nevermind.

因此,您可能应该Dispose在发送后立即从代码中删除该方法。您可以在Client_SendCompletesender对象可能是客户端)中处置您的客户端,或者您可以在您的类中创建一个静态字段,并在程序关闭后处置它(据我所知,这是一个 WinForms 项目,因此您可以处理一些 Windows 事件)