Абсолютно тривиальная задача, необходимо отослать email
Задача
Рассылка персональные email-ов по списку
Количество мыл порядка ~30000
Имеем
1. Web сайт на котором мы создаем рассылку из загруженного списка мыл.
2. Win сервис
Первый поток
Сообщения персонализированные (имя фамилия)
Проводит генерацию сообщений (body subj First Name, Last Name) в БД
Второй поток
Выбирает из БД подготовленные сообщения и отсылаем
Основное условие
Сервис может падать в любое ему понравившееся время
Работоспособность должна продолжиться с остановленного места
Если сообщение отослано перед падением повторно отсылать его нельзя
Технология .NET C#
Решение в лоб
Помечать после отсылки каждое сообщений ?!
Лет 10 тому назад я сделал это таким способом. В базе таблица рассылок и
таблица адресатов. В таблице рассылок шаблон сообщения и параметры
рассылки (мне нужно было обеспечить щадящий режим для sendmail поэтому
там у меня были настройки скорости посылания писем).
В таблице адресатов адрес и несколько полей (фамилия, имя и др.). Также
у каждой записи были поля status и senddate. Senddate обновлялся после
отправки. В статус записывалось одно из 4 значений. 0 — письмо не
отослано, 1 — письмо в процессе отсылки, 2 — письмо отослано, 3 — не
удалось отослать. (Я не помню было ли поле с сообщением об ошибке).
Ах да, еще были требования — никаких длинных транзакций и поменьше запросов.
Подготавливал список адресатов SQL запросом INSERT ... SELECT, выбирал
для отправки по N адресатов (кажется по 20) запросами SELECT TOP N ...
WHERE status = 0 ORDER BY id;
После выборки тут же помечал выбранные статусом 2
UPDATE ... SET status = 2 WHERE ID IN (...)
Генерировал сообщения непосредственно перед отправкой. Мне все равно
нужно было "спать" чтобы выдерживать график. Поэтому я генерировал, спал
сколько нужно, отправлял, генерировал следующее и опять спал.
По окончанию порции из N писем я обновлял БД, и все по-новой.
Года 3 тому назад мне приходило письмо от того кода.
Недостаток подхода — при падении N писем оставались в неизвестном
состоянии. Полечить можно установкой N = 1, но тогда на каждое письмо
будет 3 запроса в базу.
Здравствуйте, TimurSPB, Вы писали:
TSP>Ах ты мерзкий спамер!
Ну если бы это было спам система
то сколько сообщений на один ящик падало не критично
Re[3]: Отсылка Email-ов
От:
Аноним
Дата:
01.12.09 21:58
Оценка:
Здравствуйте, Other Sam, Вы писали:
OS>On 12/02/2009 02:44 AM, Other Sam wrote: >> После выборки тут же помечал выбранные статусом 2
OS>Ошибочка. Помечал статусом 1!
Сейчас примерно так и реализовано.
Сообщение имеет несколько статусов в которые переходит по очередности.
Ну мне не кажется что это не правильный способ
обновлять бд после каждого чиха
Может должна быть еще промежуточная очередь между сервисом и БД.
Которая делает обновления бачами.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Аноним, Вы писали:
А>>Как правильно подойти к такого рода задачам.
L>Прям-таки напрашивается использование Message Queue
А>Ну если бы это было спам система А>то сколько сообщений на один ящик падало не критично
Критично.
Сразу видно что спамер из тебя фиговый
Когда приходит 1 письмо от "Супер клиник" с предложением "enlarge your pencil", то просмотров будет больше, чем когда за раз адресату придет 3 таких письма.
Здравствуйте, Аноним, Вы писали:
А>Абсолютно тривиальная задача, необходимо отослать email
А>Задача А> Рассылка персональные email-ов по списку А> Количество мыл порядка ~30000
А>Имеем А>1. Web сайт на котором мы создаем рассылку из загруженного списка мыл. А>2. Win сервис
А>Первый поток А> Сообщения персонализированные (имя фамилия) А> Проводит генерацию сообщений (body subj First Name, Last Name) в БД
А>Второй поток А> Выбирает из БД подготовленные сообщения и отсылаем
А>Основное условие А>Сервис может падать в любое ему понравившееся время А>Работоспособность должна продолжиться с остановленного места А>Если сообщение отослано перед падением повторно отсылать его нельзя
А>Технология .NET C#
А>Решение в лоб А>Помечать после отсылки каждое сообщений ?!
А>Как правильно подойти к такого рода задачам.
Взять нормальный SMTP сервер (например из состава IIS), который умеет отправлять письма из dropbox (каталог на диске), веб-сайт получает список, формирует письма и складывает их в dropbox, за отсылку пусть парится smtp-сервер.
Re[2]: Отсылка Email-ов
От:
Аноним
Дата:
02.12.09 14:23
Оценка:
Здравствуйте, gandjustas, Вы писали:
А>>Решение в лоб А>>Помечать после отсылки каждое сообщений ?!
А>>Как правильно подойти к такого рода задачам.
G>Взять нормальный SMTP сервер (например из состава IIS), который умеет отправлять письма из dropbox (каталог на диске), веб-сайт получает список, формирует письма и складывает их в dropbox, за отсылку пусть парится smtp-сервер.
Здравствуйте, Аноним, Вы писали:
А>Абсолютно тривиальная задача, необходимо отослать email
А>Первый поток А> Сообщения персонализированные (имя фамилия) А> Проводит генерацию сообщений (body subj First Name, Last Name) в БД
А зачем имея шаблон и персонофицированную информацию — сохранять результат генерации в бд?