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

SmtpClient.SendAsync not sending email versus SmtpClient.Send

我正在从事一个项目,该项目(不幸的是)要求允许的最大框架是 .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();
}

有什么我完全想念的吗?谢谢。

如果在后台 运行 asynchronously,则调用 asynchronous 的操作。因此,您应该将 SendAsync 方法视为 start 进行操作。在此之后,您将处理实际上 运行 操作的客户端,而不是等待它完成,所以您就像说:嘿,请为我启动这个,请......哦,没关系。

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