我刚刚将客户的经典ASP网站移动到他们自己的VPS服务器(Windows 2003,32位,IIS6,虚拟SMTP服务器),大约12小时后,网站在尝试发送电子邮件时开始失败(CDO.Message) )。
发送电子邮件的任何脚本在返回错误之前花了很长时间:Active Server Pages,ASP 0113,脚本超时。标准超时已到位。奇怪的是,使用相同的电子邮件发送方法和设置(实际上是相同的功能)向我发送错误的自定义错误页面能够向我发送错误通知。
我需要让网站运行,所以我停止/启动了没有帮助的SMTP服务器,然后重新启动了IIS,立即解决了问题。
我担心这可能会再次发生。有什么可能导致此问题的建议或默认SMTP服务器是否需要一些额外的设置来应对相当大量的网站?
答案 0 :(得分:2)
由于经典ASP代码必须调用外部基于COM的组件才能发送电子邮件(如果您正在创建CDO消息,那就是您正在做的事情---只要您在asp代码中有一个CreateObject调用,那就是COM ),如果外部组件需要很长时间来响应,asp代码似乎会挂起。例如,大多数SMTP组件将同步尝试将邮件发送到SMTP服务器,阻止您的asp代码执行,直到发送电子邮件。这在非常繁忙的SMTP服务器上会出现问题,因为它们对连接请求和SMTP命令的响应速度非常慢。另一个糟糕的情况是,许多ISP /主机试图通过故意使其SMTP服务器响应缓慢来限制您发送电子邮件的速度。更糟糕的是,一些主机甚至会在设定的时间段内实际进行后续连接逐渐变慢。这可能会严重影响您的网站性能,因为您通常会在SMTP发送期间阻止您的网页代码。
最佳解决方案是使用不强制执行此类限制措施的主机或SMTP服务器。除此之外,有一种方法可以通过使用消息队列来解决这个问题。如果您使用的是CDO,则表示您必须在IIS Web服务器上配置Microsoft SMTP服务以供使用。即使您在IIS计算机上有其他SMTP软件,也可以正确配置。在IIS服务器上运行Microsoft SMTP服务后,它将能够在服务器上对电子邮件进行排队,并将它们与您的应用程序/页面代码异步转发到配置的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服务器速度慢而阻塞。
答案 1 :(得分:0)
我后来发现电子邮件的实际发送并没有引起问题,而是我通过从另一个ASP页面(通过XML对象)检索HTML来为电子邮件生成HTML正文。
我尝试了各种方法来解决问题,包括切换邮件组件(到Jmail)和使用不同版本的XML对象,但问题仍会间歇性地发生。
最后,我更改了代码以生成电子邮件正文的HTML,而不是调用另一个ASP页面并阅读它的响应。
消除对XML对象的使用似乎已经解决了问题,但是找不到原因。