Классический веб-сайт ASP превысил время отправки почты (IIS6, SMTP-сервер по умолчанию) - PullRequest
2 голосов
/ 23 июля 2011

Я только что переместил веб-сайт Classic ASP клиента на собственный VPS-сервер (Windows 2003, 32-разрядный, IIS6, виртуальный SMTP-сервер), и примерно через 12 часов веб-сайт начал давать сбой, когда он пытался отправить электронную почту (CDO.Message)).

Любому сценарию, который отправил сообщение электронной почты, потребовалось очень много времени, прежде чем он вернул ошибку: страницы активного сервера, ASP 0113, время ожидания сценария истекло.Стандартный тайм-аут на месте.Странно, что пользовательская страница ошибок, которая отправляет мне ошибки, используя тот же метод отправки электронной почты и настройки (фактически, та же функция), смогла отправить мне уведомление об ошибке.

Мне нужно было запустить сайт, чтобы я остановился / запустилсяSMTP-сервер, который не помог, затем перезапустил IIS, который немедленно решил проблему.

Я беспокоюсь, что это может произойти снова.Какие-либо предложения относительно того, что может вызвать эту проблему, или для SMTP-сервера по умолчанию требуются дополнительные настройки для работы с достаточно объемным веб-сайтом?

Ответы [ 2 ]

2 голосов
/ 13 апреля 2012

Поскольку классический ASP-код должен вызывать внешний компонент на основе COM для отправки электронной почты (это то, что вы делаете, если создаете сообщение CDO - каждый раз, когда в вашем asp-коде есть вызов CreateObject, то есть COM), код asp будет зависать, если внешнему компоненту требуется много времени для ответа.Например, большинство компонентов SMTP будут синхронно пытаться отправить сообщение на SMTP-сервер, блокируя выполнение вашего asp-кода до тех пор, пока сообщение электронной почты не будет отправлено.Это становится проблемой на очень занятых SMTP-серверах, так как они могут очень медленно отвечать на запросы соединения и SMTP-команды.Еще одна неприятная ситуация - многие провайдеры / хосты пытаются снизить скорость отправки электронной почты, целенаправленно заставляя свои SMTP-серверы реагировать медленно.Хуже того, некоторые хосты зашли настолько далеко, что фактически делают последующие соединения в течение заданного периода времени все медленнее.Это может существенно повлиять на производительность вашего сайта, так как вы обычно блокируете код своей страницы во время отправки SMTP.

Лучшим решением будет использование хоста или SMTP-сервера, который не применяет такие ограничительные меры.За исключением этого, есть способ обойти это, используя очереди сообщений.Если вы используете CDO, это означает, что вы должны настроить Microsoft SMTP Service на вашем веб-сервере IIS для использования.Это можно настроить правильно, даже если на компьютере IIS установлено другое программное обеспечение SMTP.После запуска службы SMTP Microsoft на вашем сервере IIS она сможет ставить электронную почту на сервер и асинхронно перенаправлять ее на настроенный SMTP-сервер к коду вашего приложения / страницы.При настройке службы SMTP Microsoft вы должны определить, что она называет «умным хостом».Это просто SMTP-сервер, на который вы собираетесь направить исходящую электронную почту для доставки в вашу сеть.

После того, как вы настроили это, вам просто нужно изменить код, который использует CDO для постановки в очередь сообщения электронной почты вместо того, чтобы пытаться отправить его.В вашем коде CDO у вас должна быть строка, которая устанавливает значения полей CDO, которые выглядят примерно так:

objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 

Вы хотите изменить значение поля "sendusing" со значения 2 на значениеof 1. Это перечисляемые значения для перечислений cdoSendUsingPort (2) и cdoSendUsingPickup (1).Как только вы это сделаете, вы также можете удалить поля «smtpserver» и «smtpserverport», так как они переопределяются тем, как настроена ваша служба Microsoft SMTP.Как только вы это сделаете, ваш asp-код быстро сгенерирует сообщение электронной почты, и оно будет помещено в очередь в папке приема почты сервера IIS.Таким образом, код вашего приложения / страницы будет работать намного быстрее.Исходящие электронные письма потенциально могут накапливаться в папке очереди, поскольку служба SMTP медленно работает над их доставкой в ​​фоновом режиме.Это не делает отправку электронной почты быстрее, но предотвращает блокировку вашего кода из-за медленного SMTP-сервера.

0 голосов
/ 13 апреля 2012

Позже я обнаружил, что фактическая отправка электронного письма не была причиной проблемы, но факт, что я генерировал тело HTML для электронного письма, извлекая HTML из другой страницы ASP (через объект XML).

Я пытался решить эту проблему разными способами, включая переключение почтовых компонентов (на Jmail) и использование разных версий объекта XML, но проблема все равно возникала бы периодически.

В конце я изменил код для генерации HTMLдля тела письма вместо вызова другой страницы ASP и чтения ее ответа.

Устранение использования объекта XML, похоже, решило проблему, но причина так и не была найдена.

...