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