我正在开发一个项目(不幸的是)需要允许最大框架为.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();
}
有什么东西我只是缺少了吗?感谢。
答案 0 :(得分:2)
如果在后台运行asynchronous
,则会调用asynchronously
。因此,您应该将SendAsync
方法视为操作的开始。在此之后,你正在处理实际运行该操作的客户端,而不是等待它完成,所以你就像说:嘿,请为我开始,请...哦,没关系。
因此,您可能应该在发送后立即从代码中删除Dispose
方法。您可以在Client_SendComplete
(sender
对象可能是客户端)处置您的客户端,或者您可以在您的类中创建一个静态字段,并在程序关闭后将其处置(尽我所能)看,这是一个WinForms项目,所以你可以处理一些Windows事件)