Приложение ASP.NET MVC + SQL Server: лучший способ рассылки событийных уведомлений по электронной почте

У меня есть приложение ASP.NET MVC, которое использует NHiberante и SQL Server 2008 на сервере. Существуют требования для отправки как событийных уведомлений на ежедневной / еженедельной основе, так и общих уведомлений на еженедельной основе.

Вот пример того, как должен работать рабочий процесс, управляемый событиями:

  1. Сотрудник (и) создает несколько заказов на поставку.
  2. Уведомление по электронной почте отправляется ежедневно любому руководителю с подчиненным сотрудником, который сделал заказ на покупку со списком всех заказов на покупку, созданных подчиненными, которые требуют его утверждения. Супервизор должен получить это только один раз (например, если Сотрудник А создает ЗП, его руководитель не должен получать электронное письмо КАЖДЫЙ ДЕНЬ, пока он не одобрит). Кроме того, в список заказов на закупку следует включать ТОЛЬКО те заказы, против которых надзорный орган НЕ принял никаких мер. Если заказы на закупку не требуют одобрения со стороны конкретного руководителя ... они не должны получать электронное письмо.
  3. Уведомление по электронной почте отправляется ежедневно менеджерам отделов со списком всех заказов на закупку, УТВЕРЖДЕННЫХ подчиненными руководителями аналогично пункту 2 выше.
  4. Каждый раз, когда предпринимаются какие-либо действия в отношении утверждения заказа на поставку надзорным органом или отделом. менеджера, сотрудник должен получать уведомление по электронной почте ежедневно со ВСЕМИ такими изменениями. Если их нет для данного сотрудника, он вообще не должен получать электронную почту.

Итак, учитывая такой рабочий процесс:

  • Как лучше всего запланировать получение таких уведомлений ежедневно, еженедельно или даже сразу после наступления события?
  • Как обеспечить доставку таких событийно-ориентированных уведомлений ТОЛЬКО один раз?
  • Как бы вы обрабатывали исключения, чтобы обеспечить регистрацию неудачных попыток отправки электронной почты и возможность ее отправки на следующий день?

Спасибо!


person wgpubs    schedule 20.09.2009    source источник


Ответы (5)


Вы можете добавить обычное действие в контроллер

Function SendEmails() As ActionResult
    Dim result As String = ""
    ''//big timeout to handle the load
    HttpContext.Server.ScriptTimeout = 60 * 10 ''//ten minutes

    result = DoTheActualWork()

    ''//returns text/plain
    Return Content(result)

End Function

А затем вызвать страницу из запланированного задания. Может быть запланированной задачей на сервере или на любом компьютере. Используйте для этого .vbs:

SendEmails.vbs:

''//Force the script to finish on an error.
On Error Resume Next

''//Declare variables
Dim objRequest
Dim URL

Set objRequest = CreateObject("Microsoft.XMLHTTP")

''//Put together the URL link appending the Variables.
URL = "http://www.mysite.com/system/sendemails"

''//Open the HTTP request and pass the URL to the objRequest object
objRequest.open "POST", URL , false

''//Send the HTML Request
objRequest.Send

''//Set the object to nothing
Set objRequest = Nothing
person Eduardo Molteni    schedule 21.09.2009
comment
Может ли это тайм-аут, если отправляется МНОГО электронных писем? - person wgpubs; 12.01.2010
comment
Потенциально да (это будет зависеть от почтового сервера, оборудования веб-сервера и т. Д.). Протестируйте его и соответствующим образом отрегулируйте настройку HttpContext.Server.ScriptTimeout. - person Eduardo Molteni; 12.01.2010

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

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

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

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

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

person Kelsey    schedule 21.09.2009
comment
По вопросу отслеживания и архивирования отправленных уведомлений .... если в дополнение к любому другому каналу передачи (электронная почта, твиттер и др.) Вы создаете адрес электронной почты приложений Google, регистрируйте на нем все транзакции, вы получаете чтобы подключиться к поисковой системе Google. Поиск не более чем по номеру заказа, вы получите все связанные транзакции. Примените простую фильтрацию, и вы получите действительно интересные возможности - вставьте правильные ссылки в эти «электронные письма», и вы сможете подключиться к cms вашего приложения или подсистемам отчетности. - person justSteve; 13.10.2010

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

person Aaron Fischer    schedule 20.09.2009

Это можно сделать с помощью агента SQL Server, подробнее об этом читайте здесь:

http://msdn.microsoft.com/en-us/library/ms189237.aspx

person Burt    schedule 20.09.2009

Похоже на работу по обслуживанию или плановую работу.

Вы не хотите делать это в ASP.NET, потому что вам придется настроить IIS, чтобы ваше приложение постоянно работало, что может быть не лучшей идеей.

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

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

person Community    schedule 20.09.2009