Приложение ASP.NET MVC + SQL Server: лучший способ отправлять уведомления по электронной почте на основе событий - PullRequest
5 голосов
/ 21 сентября 2009

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

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

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

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

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

Спасибо!

Ответы [ 5 ]

4 голосов
/ 21 сентября 2009

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

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

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

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

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

2 голосов
/ 21 сентября 2009

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

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
0 голосов
/ 21 сентября 2009

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

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

0 голосов
/ 21 сентября 2009

Походит на работу для обслуживания или запланированной работы.

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

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

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

0 голосов
/ 21 сентября 2009

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

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