2011-07-23 124 views
1

我剛將客戶的經典ASP網站移動到他們自己的VPS服務器(Windows 2003,32位,IIS6,虛擬SMTP服務器),並在大約12小時後每當它嘗試發送電子郵件時,該網站就會失敗(CDO.Message)。經典ASP網站超時發送郵件(IIS6,默認SMTP服務器)

任何發送電子郵件的腳本在返回錯誤之前花了很長時間:Active Server Pages,ASP 0113,Script超時。標準超時已到位。奇怪的是,使用相同的電子郵件發送方法和設置(實際上是相同的功能)向我發送錯誤的自定義錯誤頁面能夠向我發送錯誤通知。

我需要讓網站進入,所以我停止/啓動了SMTP服務器,但沒有幫助,然後重新啓動了IIS,它立即解決了問題。

我擔心這可能會再次發生。任何可能導致此問題的建議或者默認的SMTP服務器是否需要一些額外的設置來應對合理的大容量網站?

回答

0

我後來發現電子郵件的實際發送並不是問題,而是通過從另一個ASP頁面(通過XML對象)檢索HTML來生成電子郵件的HTML正文。

我嘗試了各種各樣的事情來解決問題,包括切換郵件組件(到Jmail)和使用不同版本的XML對象,但問題仍會間歇性地發生。

最後我改變了代碼,爲電子郵件正文生成HTML,而不是調用另一個ASP頁面並閱讀它的響應。

消除XML對象的使用似乎解決了問題,但從未找到原因。

2

由於傳統的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 

你想從一個值2,爲「sendusing」字段的值更改爲1的值。這些是cdoSendUsingPort(2)和cdoSendUsingPickup(1)枚舉的枚舉值。一旦你這樣做,你也可以刪除「smtpserver」和「smtpserverport」字段,因爲這些字段會被你的Microsoft SMTP服務配置覆蓋。一旦你這樣做了,你的asp代碼將快速生成電子郵件消息,並且它將在IIS服務器的郵件提取文件夾中排隊。所以你的應用程序/頁面代碼將運行得更快。傳出的電子郵件將潛在地累積在隊列文件夾中,因爲SMTP服務在緩慢處理它們在後臺傳送它們時起作用。它不會使電子郵件發送得更快,但它確實可以防止由於SMTP服務器較慢而導致的代碼被阻止。

+0

雖然我之前使用Jmail通過將郵件放入拾取文件夾來發送郵件,但我並不知道這可以通過CDO郵件組件完成,所以請使用+1來顯示如何完成此操作。 – johna

相關問題