我开发了一个主要使用SMTP发送电子邮件的应用程序。一个接一个地发送消息很好,但是我希望加快这个过程。我创建了SmtpClient
的多个实例以及消息,以避免彼此之间发生冲突。由于单独的实例,我假设在多个线程上执行.Send()
会很好。但是,单独使用Thread
代码的内容无效,因为我无法使用此代码在一个线程上发送一封电子邮件。我只是收到一个模糊的"Failure sending mail"
例外。我将发布有效的代码,以及不起作用的Thread
。有人可以分享他们认为可能是原因吗?
注意我目前不打算使用较新的async
功能,而是利用Thread
工作声明和方法致电:
var SMTP = new SmtpClient
{
Host = txtBxSenderHost.Text,
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(strSenderAddress, strSenderPassword)
};
using (var message = new MailMessage(senderAdrress, toAddress)
{
Subject = strSubject,
Body = strBody
})
{
SMTP.Send(message);
}
不工作线程声明和方法调用:
var SMTP = new SmtpClient
{
Host = txtBxSenderHost.Text,
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(strSenderAddress, strSenderPassword)
};
using (var message = new MailMessage(senderAdrress, toAddress)
{
Subject = strSubject,
Body = strBody
})
{
Thread T1 = new Thread(delegate() { SMTP.Send(message); } );
T1.Start();
}
答案 0 :(得分:12)
解决:
var SMTP = new SmtpClient
{
Host = txtBxSenderHost.Text,
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(strSenderAddress, strSenderPassword)
};
Thread T1 = new Thread(delegate()
{
using (var message = new MailMessage(senderAdrress, toAddress)
{
Subject = strSubject,
Body = strBody
})
{
{
SMTP.Send(message);
}
}
});
T1.Start();
答案 1 :(得分:3)
通过事先定义所有内容并调用新线程,您可以更轻松地完成任务。
//define everything above
Thread t1 = new Thread(delegate()
{
SMTP.send(message);
});
t1.Start();
这就是我做了什么,它使这些花括号的生活更轻松
答案 2 :(得分:1)
为什么不直接使用Smtp.SendAsync方法?