SMTP через ASP.Net 2 проблема размера сеанса - PullRequest
0 голосов
/ 09 марта 2009

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

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

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

Что нас не устраивает, так это то, что если вы просто оставите программу для обработки после примерно 6 тыс. Электронных писем, мы получим сообщение об ошибке «Максимальный размер сеанса», и она больше не будет отправлять письма.

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

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

У меня было несколько предложений по связанным запросам, которые предлагают полностью переработать виджет или даже написать приложение для массовой рассылки на заказ.

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

Есть ли у кого-нибудь практичные предложения по отслеживанию сгенерированных писем .Net 2.0 с исходного сервера?

Ответы [ 3 ]

1 голос
/ 09 марта 2009

Почему сеанс растет? Вы делаете это в течение жизни запроса?

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

Если часть отслеживания не вызывает проблем, а представляет собой одноразовое электронное письмо (или отправляющий их виджет), вы можете попробовать группировать электронные письма и BCC, а не отправлять их по одному. , Копии слепых копий всегда адресуются лично и не сообщают получателю, что они были отправлены по почте. Вам просто нужно определить ограничение на количество писем, которые вы можете отправить через BCC.

Третий вариант - поместить в свое веб-приложение то, что вам нужно для генерации этих электронных писем, в общее хранилище и иметь приложение Windows Service (или приложение запланированных задач), которое регулярно проверяет новые почтовые задания и обрабатывает их вне вашего веб-приложения ... может быть, даже за пределами хост-сервера вашего веб-приложения. Конечно, подобные вещи не будут работать на серверах общего хостинга ...

0 голосов
/ 29 июля 2018

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

Ошибка, о которой вы упомянули «Максимальный размер сеанса», является реальной причиной путаницы. Даже эта ошибка ясно говорит о том, что фактической проблемой «размера» является «число», что очень важно принять вашему почтовому серверу. Каждый почтовый (SMTP) сервер настроен таким образом, что он ограничивает различные факторы, такие как индивидуальный номер электронной почты, конечный номер получателя и т. Д. По соображениям безопасности. Допустим, кто-то пытается отправить электронное письмо размером 1 МБ тысяче получателей, которым пользователю нужно всего лишь перевести около 1 МБ данных со своего хоста на SMTP-сервер, где сам сервер должен передать 1 ГБ данных для успешной доставки всей этой электронной почты. Более 2 ГБ данных на случай возврата каждого письма назад. Для защиты этого типа атак на сервер ретрансляции почты демон SMTP устанавливает какое-то ограничение. В вашем случае ваш сценарий подключается к SMTP-серверу один раз и начинает ретранслировать тысячи отдельных сообщений электронной почты, не отключаясь никогда. Сервер фактически не заботится о том, отправляете ли вы его из программы ASP.NET или любого другого почтового клиента, он ограничит вас и отклонит, когда число превысит лимит.

Поскольку вы говорили о «цикле» для генерации каждого отдельного электронного письма, просто установите другой цикл для отключения и подключения к SMTP для каждых 500 выполненных ретрансляций электронной почты. Помните, что ваш SMTP-сервер отклонил вас не из-за того, что вы пересекали какое-то ограничение по размеру, но вы достигли максимально допустимого количества ретрансляторов электронной почты при любом подключении. Подключение, ретрансляция фиксированного номера электронной почты, отключение, затем подключение снова, чтобы отправить следующую партию почты и зациклить ее, пока вы не закончите ретрансляцию каждой почты, которую вам нужно доставить.

Счастливая электронная почта (не СПАМ) ....

0 голосов
/ 09 марта 2009

Мы делаем то же самое, но мы делаем 500 писем за раз в минуту. Первые 500 отправляются, затем страница перезагружается, и работа продолжается со следующими 500.

Это займет немного регистрации и хранения информации о текущей очереди 500, с учетом тайм-аутов, ранних перезагрузок и т. Д., Но это работает (по электронной почте около 10 000 писем в любую ночь) пару года.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...