Отправить новостную рассылку на asp.net на 10000 писем - PullRequest
7 голосов
/ 28 июня 2010

Мне нужно написать заявку на рассылку. Как лучше всего рассылать новостные рассылки пользователям? Мое требование

  1. Каждое письмо отдельно как:
  2. Каждое письмо имеет уникальную ссылку для отписки

Хорошо ли использовать SMTP почтовый класс .net? Я выгляжу много вопросов, но не могу решить, к какому подходу мне пойти? Есть много предложений

  1. Многопоточная служба Windows
  2. Использовать почтовый сервер
  3. Добавить thread.sleep (2000) между каждой отправкой.

Может кто-нибудь предложить хороший способ справиться с этим?

Ответы [ 5 ]

8 голосов
/ 28 июня 2010

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

Самый простой вариант - просто создать быструю и грязную консоль или приложение Windows Form.

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

Классы в пространстве имен System.Net.Mail будут отлично работать для отправки ваших сообщений.mail.

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

У нас есть информационный бюллетень, который рассылается примерно 20000 людям в виде отдельных электронных писем, и нам пришлось поиграть с задержкой между электронными письмами, пока мы не нашли тот, который будет работать для нашего почтового хоста.Мы получили 1,2 секунды между электронными письмами, так что это может быть хорошей отправной точкой.

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

Также, если вы размещаете свою собственную электронную почту, это может не быть проблемой,И если вы размещаете свою собственную почту, у вас будет возможность отбрасывать почту в каталог раскладки, и вы можете просто скопировать ее туда так быстро, как захотите, и позволить почтовой службе забрать ее в своем собственном темпе.

РЕДАКТИРОВАТЬ: Вот настройки, которые нужно добавить в файл конфигурации для настройки каталога раскладки

<system.net>
    <mailSettings>
        <smtp from="support@test.com" deliveryMethod="SpecifiedPickupDirectory" >
            <specifiedPickupDirectory pickupDirectoryLocation="Z:\Path\To\Pickup"/>
        </smtp>
    </mailSettings>
</system.net>
2 голосов
/ 28 июня 2010

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

Это должно быть приложение или служба Windows, которая может обрабатывать такой большой объем.

1 голос
/ 01 сентября 2010

Я написал модуль Newsletter (как часть большой системы) в ASPNET MVC 2, Entity Framework и с использованием пространства имен System.Net.Mail. Он запускается в поле зрения и на самом деле просто запускается в контроллере с помощью вспомогательного метода для выполнения отправки. Когда каждое электронное письмо отправляется, я отслеживаю, существует ли жесткий бус (генерируется исключение), и я обновляю эту запись базы данных, сообщая об ошибке с исключением, в противном случае я обновляю запись, сообщая об успехе. Мы также выполняем персонализацию, поэтому у нас есть «теги», которые заменяются дополнительным полем в базе данных (для гибкости хранится в формате XML). Это помогает обрабатывать функцию отмены подписки.

Мой код довольно прост (пожалуйста, не говорите мне, что я использую обработку исключений в качестве бизнес-логики;), и он работает как шарм.

Все это делается на VPS на http://maximumasp.com, на котором также размещаются 4 сайта с довольно приличным трафиком. Мы используем их SMTP-серверы. Мы уведомили их, что нам нужна эта услуга, и у нас не было проблем с отношениями.

У нас было 2 ГБ ОЗУ на машине под управлением Windows 2008, и она выполняла 6 электронных писем в секунду. Мы увеличили его до 3 ГБ, так как веб-сайтам это нужно, и теперь рассылка делает около 20 писем в секунду. Наши рассылки варьируются от 2000 до 100 000 адресов электронной почты.

Короче говоря, ASP.NET можно использовать для обработки почтовых рассылок, и если вы добавите некоторую логику для обработки обновлений записей, то беспокойство о том, что вы потеряете свой путь в середине посылки, уменьшится. Да, вероятно, есть более приятные способы сделать это. Мы обращаем внимание на MQMS и многопоточность, а также разделяем это на службу Windows, чтобы сделать ее более стабильной и масштабируемой, поскольку мы добавляем больше клиентов и большие списки, но на данный момент она отлично работает с разумными отчетами и обработкой ошибок.

1 голос
/ 28 июня 2010

Создайте веб-страницу для «разработки» новостной рассылки. Когда они нажмут «Отправить», поставьте их в очередь (база данных) и используйте другую программу (служба Windows и т. Д.) Для отправки письма в очереди. Это будет во много раз более эффективным и потенциально отказоустойчивым при правильной разработке.

1 голос
/ 28 июня 2010

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

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

  • У процесса, который за пределами ASP.NET действительно отправляется электронная почта.Это может быть файл VBS, настроенный как запланированная задача, или (предпочтительно) служба Windows.Процесс будет принимать текст сообщения электронной почты, добавлять ссылку для отмены подписки и после успешной отправки помечать запись базы данных как отправленную.Таким образом, если отправка не удалась, она может повторить попытку позже (процесс отправки проходит по всем записям, помеченным как неотправленные).

  • Если вам нужен журнал того, что было отправлено и когда, вам просто нужно сохранить отправленные записи в таблицах базы данных.В противном случае просто удалите записи, которые были успешно отправлены.

ИМХО отправка электронных писем в рабочем процессе ASP.NET - плохая идея, потому что вы не знаете, сколько времени это займет, и еслиНе удается отправить, есть небольшая возможность повторить попытку до истечения срока ожидания страницы.

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