SmtpClient.SendAsync不发送电子邮件而不是SmtpClient.Send

时间:2017-01-05 21:50:25

标签: 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();
}

有什么东西我只是缺少了吗?感谢。

1 个答案:

答案 0 :(得分:2)

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

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