2010-01-20 2 views
0

У меня возникла проблема с отправкой больших объемов писем из приложения ASP.Net. Я не буду публиковать код, но объясню, что происходит. Код должен отправлять электронные письма 4000 получателям, но, похоже, останавливается на 385/387.Проблемы с отправкой большого объема писем с использованием ASP.Net


Код создает содержимое для электронной почты в строке.

Затем он выбирает список адресов электронной почты для отправки.

Цитирование через данные через datareader, он выбирает адрес электронной почты и отправляет электронное письмо.

Отправка электронной почты осуществляется отдельным методом, который может обрабатывать сбои и возвращает результат.

По мере отправки каждой записи я создаю узел XML в документе XML для регистрации каждой конкретной попытки отправки.

Петля, кажется, заканчивается преждевременно, и документ XML сохраняется на диск.


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

Я не думаю, что сама страница разрывается, но даже если это так, я был уверен .Net продолжил бы обработку страницы, даже если пользователь увидел ошибку таймаута страницы.

Любые предложения ценят, потому что я довольно тупой.

+0

Возможно, вам будет полезно разместить часть кода. Кроме того, просмотрите журналы событий, чтобы увидеть, произошли ли какие-либо сбои. –

ответ

0

Если у веб-сервера установлен тайм-аут, он будет убивать страницу, если она работает слишком долго.

4

Вы отправляете много писем. Во время одного запроса? IIS убьет запрос, если потребуется больше определенного (настраиваемого) количества времени.

Вам нужно использовать отдельный процесс для создания подобных вещей. Независимо от того, какой таймер вы запускаете из global.asax или Thread, который проверяет список электронных писем в каталоге database/app_data или службу, которую вы отправляете с помощью WCF, или какая-либо их комбинация.

+2

Отправка большого количества писем из asp.net, независимо от того, как вы это делаете (таймеры, а что нет) - плохая идея. Используйте отдельное сервисное приложение для обработки электронной почты. –

2

Способ, которым я занимался в прошлом, заключается в том, чтобы помещать электронные письма в таблицу SQL Server, а затем запускать другой поток, чтобы фактически обрабатывать/отправлять электронные письма. Другая служебная страница aspx может дать мне статус очереди или перезапустить обработку.

Я также высоко рекомендую использовать существующую, законную стороннюю почтовую службу для вашего SMTP-сервера, если вы отправляете почту широкой публике. В противном случае вы рискуете, что ваш интернет-провайдер отключит ваш почтовый доступ или, что еще хуже, ваш собственный сервер будет занесен в черный список.

0

Я рекомендую вам проверить значение HttpServerUtility.ScriptTimeout - если это установлено, то, когда скрипт работает в течение этого периода времени, он будет отключен.

Что-то, что вы могли бы сделать, чтобы помочь, - это полностью старая школа - объедините некоторые Response.Writes с несколькими Response.Flush, чтобы отправить некоторые данные обратно в клиентский браузер, и это, как правило, поддерживает сценарий (конечно, работает на старом ASP. NET 1.1 сайт у нас был).

Также необходимо учитывать, когда этот сценарий запускается - сервер также может быть настроен для выполнения сброса приложения (по умолчанию это устанавливается каждые 29 часов в IIS), если ваш сервер установленного примерно на 24 часа, и это совпадает с временем запуска вашего сценария, вы тоже можете это увидеть, хотя факт, что запись сценария его ответа, вероятно, не соответствует этому, если только ваш XML-документ плохо сформирован?

Все, что было сказано, я бы использовал Will's answer, используя отдельный процесс (не только поток, размещенный на сайте), либо как Bryan said, идите с надлежащей службой рассылки, которая поможет вам в таких вещах, как отскок обратная связь, отслеживание кликов, отчетность, открытые подсчеты и т. д. и т. д.