C# SmtpClient-什么是适当的生存期?
我正在创建每5分钟发送一批电子邮件的Windows服务 我想每5分钟发送10-100封电子邮件。这是极端的边缘情况。批次每5分钟发送一次,通常最多包含10封电子邮件 我正在使用System.Net.Mail命名空间中的SmtpClient SmtpClient对象的正确生存期是多少? 是否应该在每次发送批处理时创建一个?C# SmtpClient-什么是适当的生存期?,c#,.net,email,service,C#,.net,Email,Service,我正在创建每5分钟发送一批电子邮件的Windows服务 我想每5分钟发送10-100封电子邮件。这是极端的边缘情况。批次每5分钟发送一次,通常最多包含10封电子邮件 我正在使用System.Net.Mail命名空间中的SmtpClient SmtpClient对象的正确生存期是多少? 是否应该在每次发送批处理时创建一个? 或者我应该在服务启动时创建一个,并且永远不要处理它吗?您应该始终使用using using (var smtpClient = new SmtpClient()) {
或者我应该在服务启动时创建一个,并且永远不要处理它吗?您应该始终使用
using
using (var smtpClient = new SmtpClient())
{
smtpClient.SendMail(message);
}
您应该在完成IDisposable后立即处理任何实现IDisposable的内容。在.NET 4.0中,SmtpClient类实现IDisposable,因此请务必使用它
引用MSDN:
SmtpClient类没有Finalize方法,因此应用程序必须
调用Dispose以显式释放资源
如果您发现自己正在执行异步相关任务,那么您可以为每封电子邮件创建一个新实例,以防止自己被阻止
var smtpClient = new SmtpClient();
smtpClient.SendCompleted += (s, e) => {
client.Dispose();
message.Dispose();
};
client.SendAsync(message, null);
应请求-批量发送电子邮件的最佳选择
如上所述,您可以重用同一个客户端。如果你把它都放在同一个线程上,我建议你只使用一个客户端
MSDN声明:
SmtpClient类实现池SMTP连接,以便
可以避免为每个节点重新建立连接的开销
将消息发送到同一服务器应用程序可以重复使用相同的
SmtpClient对象向同一SMTP发送许多不同的电子邮件
服务器和多个不同的SMTP服务器。
然而,它接着说:
…因此,无法确定应用程序何时启动
已完成使用SmtpClient对象,应将其清理
因此,假设您在完成后处理您的客户,这是可以的
下面链接了一些与SMTP相关的主题,因为我最近发现自己也在问同样的问题 Stackoverflow的更多信息: 相关阅读:
首先,在需要的时候使用任何对象都是一个非常好的做法,除非你需要在整个应用程序中使用它 其次,您应该在每次需要时创建SmtpClient的对象,并正确地处理它,为此,请使用Glitch100所述的using标记
using (var smtpClient = new SmtpClient())
{
smtpClient.SendMail(message);
}
从.NET 4.0开始,SmtpClient将连接池化,因此您可以在其中保留一段时间。最好在发送完一批后进行处理 从MSDN: SmtpClient类实现将SMTP连接池化,这样就可以避免为每个邮件重新建立到同一服务器的连接的开销。应用程序可以重复使用同一SmtpClient对象向同一SMTP服务器和多个不同的SMTP服务器发送许多不同的电子邮件。因此,无法确定应用程序何时使用SmtpClient对象完成,应该清理它
我真的不同意“一旦有机会”这一部分。在我的申请表中,“一旦”是什么?另外,创建SmtpClient需要时间,因为它需要建立安全连接。这是我疯狂编辑的一部分。没有什么能阻止你使用一个客户端,特别是如果你完全控制着电子邮件的流量,但是你可能会发现你自己会遇到例外,因为它仍然在等待回复,所以无法发送电子邮件。如果你限制数量的话,它不会太贵。如果您决定使用一个客户机,也许使用BlockingCollection和信号量可以实现这一点,我想我会在每个批的客户机上创建一个。它看起来比每封邮件和每一个应用程序一次更符合逻辑。如果您在发送一批邮件时添加一个小注释,描述SmtpClient的最佳实践,我将接受您的回答。谢谢。您好@Hooch,它是在主线程中处理的,还是您正在为此创建更多?