我刚刚移动了一个客户的经典ASP网站到他们自己的VPS服务器(Windows2003,32位,IIS6,虚拟SMTP服务器),大约12小时后,网站开始失败,每当它试图发送电子邮件(CDO.Message)。
发送电子邮件的任何脚本都花了很长时间才返回错误: Active Server Pages,ASP 0113,script timed out。标准超时已就位。奇怪的是,自定义错误页面使用相同的电子邮件发送方法和设置(实际上是相同的功能)向我发送错误,却能够向我发送错误通知。
我需要让网站运行起来,所以我停止/启动了SMTP服务器,但没有帮助,然后重启了IIS,它立即解决了这个问题。
我担心这种情况会再次发生。有什么建议可以导致这个问题,或者默认的SMTP服务器是否需要一些额外的设置来处理相当大的网站?
发布于 2012-04-13 12:36:57
后来,我发现问题不在于电子邮件的实际发送,而在于我是通过从另一个ASP页面(通过XML对象)检索HTML来为电子邮件生成HTML正文的。
我尝试了各种方法来解决这个问题,包括切换邮件组件(到Jmail)和使用不同版本的XML对象,但问题仍然间歇性地出现。
最后,我更改了代码以生成电子邮件正文的HTML,而不是调用另一个ASP页面并读取它的响应。
消除对XML对象的使用似乎已经解决了问题,但从来没有找到原因。
发布于 2012-04-13 08:24:03
由于传统的ASP代码必须调用基于COM的外部组件才能发送电子邮件(这就是你在创建CDO消息时所做的事情-任何时候你在你的asp代码中有一个CreateObject调用,也就是COM),如果外部组件需要很长时间来响应,asp代码将看起来挂起。例如,大多数SMTP组件将同步尝试发送消息到SMTP服务器,阻止您的asp代码执行,直到发送电子邮件消息。这在非常繁忙的SMTP服务器上成为一个问题,因为它们对连接请求和SMTP命令的响应可能非常慢。另一种糟糕的情况是,许多ISP的/主机试图通过故意使他们的SMTP服务器响应缓慢来限制您发送电子邮件的速度。更糟糕的是,一些主机甚至会在一段设定的时间内使后续连接变得越来越慢。这会严重影响站点性能,因为在SMTP发送过程中,您的页面代码通常会被阻止。
最佳解决方案是使用不强制执行此类限制措施的主机或SMTP服务器。除此之外,有一种方法可以通过使用消息队列来解决这个问题。如果您使用的是CDO,这意味着您必须在IIS web服务器上配置Microsoft SMTP服务才能使用。即使IIS机器上有其他SMTP软件,也可以正确配置。一旦Microsoft SMTP服务在您的IIS服务器上运行,它将能够在服务器上对电子邮件进行排队,并将它们异步转发到配置的SMTP服务器上,以响应您的应用程序/页面代码。在配置Microsoft SMTP服务时,必须定义它所称的“智能主机”。这只是您要将出站电子邮件路由到的SMTP服务器,以便在您的网络上传递。
配置完成后,您只需更改使用CDO对电子邮件消息进行排队的代码,而不是尝试发送它。在您的CDO代码中,应该有一行设置CDO字段值,如下所示:
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 您希望将"sendusing“字段的值从2更改为1。这些是cdoSendUsingPort (2)和cdoSendUsingPickup (1)枚举的枚举值。执行此操作后,您还可以删除"smtpserver“和"smtpserverport”字段,因为无论如何配置Microsoft SMTP服务,这些字段都会被覆盖。一旦您这样做,您的asp代码将快速生成电子邮件消息,它将在IIS服务器的邮件拾取文件夹中排队。因此,您的应用程序/页面代码将运行得更快。传出的电子邮件可能会累积在队列文件夹中,因为SMTP服务在后台缓慢地传递它们。它不会使电子邮件发送更快,但它确实可以防止您的代码由于缓慢的SMTP服务器而阻塞。
https://stackoverflow.com/questions/6797928
复制相似问题