2014-07-03 4 views
2

Люди,Автоматические письма в рамках проекта MVC в Visual Studio 2013

Мы только что запустили приложение для опроса в последнее время, его MVC использует LINQ для сущности.

У нас есть таблица SurveyStatus.

Каждый понедельник мы хотим запустить автоматический запрос, который будет проверять, завершено ли опрос. Если опрос завершен, отправьте электронное письмо, чтобы информировать пользователя.

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

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

Заранее спасибо

+0

[HangFire] (https://github.com/HangfireIO/Hangfire) довольно скалы для этого. –

+0

Почему нет запланированного сценария PowerShell для выполнения задания, используя копию кода .Net? – ThatBlairGuy

ответ

0

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

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

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

Кроме того, все, что вам понадобится, это SMTP-сервер, на самом деле отправляющий сообщение, похожее на то, что у вас уже есть.

1

Пожалуйста, взгляните на проект с открытым исходным кодом Revalee.

Revalee - это сервис, который позволяет планировать веб-обратные вызовы для вашего приложения ASP.NET MVC. Revalee управляет постоянством и планированием задач с использованием службы Windows, но использует приложение ASP.NET MVC для обработки усилий по обработке (т. Е. «Работа»).

Ниже приводится последовательность действий в приложении MVC, использующего Revalee:

Revalee Workflow http://revalee.sageanalytic.com/Images/workflow.png

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

< редактировать >

Что-то еще, чтобы рассмотреть ...

Вы можете изменить способ приблизиться к вашей проблемной области. Вместо того, чтобы планировать фиксированную задачу «каждый понедельник» (т. Е. Выполнять процесс, который одновременно проверяет все опросы), переверните обработку: обрабатывайте каждый опрос индивидуально. Понятно, что это проблематично без решения обратного вызова, такого как Revalee.Но с Revalee вы можете запланировать опрос каждого пользователя, который будет обработан +48 часов (например) после их отправки. Это делает две вещи:

  1. Он изменяет осмотр обследования «работы» от тестирования все опросы для тестирования обследование.

  2. Он разворачивает инспекционную обработку в течение всех дней недели (и часов дня). То есть, он больше не будет ограничиваться обработкой каждого понедельника ровно, скажем, 8 часов утра.

Чтобы зарегистрировать более индивидуализированный обратного вызова с помощью Revalee, вы можете зарегистрировать будущую функцию обратного вызова, как это:

private void ScheduleSurveyInspection(int surveyId) 
{ 
    // The callback will be 48 hours from now 
    DateTimeOffset callbackTime = DateTimeOffset.Now.AddHours(48.0); 

    // The callback URL will include the ID of the survey to be reviewed 
    Uri callbackUrl = new Uri(
      string.Format(
        "http://mywebapp.com/Survey/Inspect/{0}", 
        surveyId 
       ) 
     ); 

    // Register the callback request with the Revalee service 
    RevaleeRegistrar.ScheduleCallback(callbackTime, callbackUrl); 
} 

Когда приложение MVC называется обратно через 48 часов, ваш SurveyController будет обрабатывать обратный вызов с использованием следующие Inspect действия:

[AllowAnonymous] 
[CallbackAction] 
public ActionResult Inspect(int surveyId) 
{ 
    // TODO Lookup the survey's information and perform the necessary review 
    // ... 
    return new EmptyResult(); 
} 

Естественно, если ваш текущий рабочий процесс обработки не может быть изменен с происходящий раз в мы ek каждый понедельник до +48 часов после подачи опроса, то Revalee все еще может использоваться для планирования этой задачи. Ваш callbackUrl бы просто:

Uri callbackUrl = new Uri("http://mywebapp.com/Survey/InspectAll"); 

</редактировать >

Я надеюсь, что это помогает. Удачи!

Отказ от ответственности: Я был одним из разработчиков, участвующих в проекте Revalee. Однако, чтобы быть ясным, Revalee является бесплатным, с открытым исходным кодом. Исходный код доступен по адресу GitHub.

0

Предлагаю вам использовать FluentScheduler.

Планировщик задач, который использует свободный интерфейс для настройки расписаний. Полезно для выполнения заданий cron/автоматизированных задач из вашего приложения.

Этот способ позволяет использовать уже реализованные методы.

using FluentScheduler; 

public class MyRegistry : Registry 
{ 
    public MyRegistry() 
    { 
     // Schedule an ITask to run at an interval 
     Schedule<MyTask>().ToRunNow().AndEvery(2).Seconds(); 

     // Schedule an ITask to run once, delayed by a specific time interval. 
     Schedule<MyTask>().ToRunOnceIn(5).Seconds(); 

     // Schedule a simple task to run at a specific time 
     Schedule(() => Console.WriteLine("Timed Task - Will run every day at 9:15pm: " + DateTime.Now)).ToRunEvery(1).Days().At(21, 15); 

     // Schedule a more complex action to run immediately and on an monthly interval 
     Schedule(() => 
     { 
      Console.WriteLine("Complex Action Task Starts: " + DateTime.Now); 
      Thread.Sleep(1000); 
      Console.WriteLine("Complex Action Task Ends: " + DateTime.Now); 
     }).ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0); 

     //Schedule multiple tasks to be run in a single schedule 
     Schedule<MyTask>().AndThen<MyOtherTask>().ToRunNow().AndEvery(5).Minutes(); 
    } 
} 

FluentScheduler Github page

0

насчет простого консольного приложения, чтобы вызвать ваши автоматические письма? Мое предложение состояло в том, чтобы использовать либо консольное приложение, либо службу Windows, запланированную для запуска каждый понедельник с помощью программного обеспечения для планирования хоста (планировщик заданий Windows, cron и т. Д.).

Here и here - интересная дискуссия по аналогичному требованию, как ваша.

Смежные вопросы