.NET发送电子邮件的最佳方法(System.Net.Mail有问题)

Jus*_*mer 18 .net asp.net smtp system.net.mail smtpclient

这看起来非常简单.我需要从一些ASP.NET应用程序发送电子邮件.我需要始终如一地做到这一点,没有奇怪的错误,并且没有CPU利用率.我不是在谈论大量的电子邮件,只是偶尔的电子邮件.

System.Net.Mail 似乎被严重破坏.SmtpClient不会发出Quit命令(可能是因为Microsoft(R)对以下规范不感兴趣),因此连接保持打开状态.因此,如果有人在该连接最终关闭之前尝试通过电子邮件发送,则可能会从SMTP服务器收到有关打开过多连接的错误.这是Microsoft(R)完全不感兴趣修复的错误.看这里:

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=146711

此外,如果你环顾一些建议使用此代码来解决此问题:

smtpClient.ServicePoint.MaxIdleTime = 1;
smtpClient.ServicePoint.ConnectionLimit = 1;
Run Code Online (Sandbox Code Playgroud)

好的,是的,这确实"解决"了连接被打开的问题.但是,如果您愿意,可以在服务器上进行尝试,这会使运行进程(在本例中为w3wp.exe)的CPU跳转并保持100%,直到您的应用程序池被回收.无论出于何种原因,运行mscorwks.dll!CreateApplicationContext的线程都是罪魁祸首.

这具有非常好的副作用,如果您在持续100%CPU使用率的Web主机上运行,​​您将禁用应用程序池.所以这并不像有些人所说的那样微不足道.

所以我的问题是该怎么办?我需要做的就是这么简单; 但是,那些"太多连接打开"错误是不可接受的,也不是100%的CPU使用率.我不想购买第三方组件,不是因为我便宜,而是因为我购买了足够的组件和MSDN订阅,因为简单的SMTP功能需要花费100到300美元.

我读到将MaxIdleTime设置得更高可能会有所帮助,但我对此持怀疑态度.我不想仅仅因为Microsoft不想遵循SMTP规范而冒着我的应用程序池被禁用的风险.

编辑: 我查看了quiksoft.com组件,但它不支持SMTP身份验证,它的成本为500美元.必须有一个解决这个问题的方法.

Ric*_*tte 30

在.NET 4.0中,SmtpClient现在是一次性的.SMTP QUIT命令在处理时发出,例如在使用块中使用时.


小智 22

我遇到了与所述设置相同的CPU利用率问题.我最终向微软开了一张票,以确定问题的原因.CPU利用率问题在于ServicePoint类.在ServicePoint类的内部,有一个每隔(MaxIdleTime/2)毫秒运行的计时器.看到问题?通过将MaxIdleTime值更改为2,CPU利用率将下降到正常水平.

  • @Scott Ferguson:问题是定时器将以(1/2)毫秒运行,整数除法将评估为......每*0*毫秒.Whoopsie. (12认同)