Visual Studio 2013中MVC项目中的自动电子邮件

时间:2014-07-03 14:56:07

标签: c# asp.net-mvc scheduled-tasks scheduler

民间,

我们最近刚刚推出了一个调查应用程序,其MVC使用LINQ to entity。

我们有一个SurveyStatus表。

每个星期一我们都想运行一个自动查询来检查调查是否完整。如果调查完成,请发送电子邮件通知用户。

以前我们使用计划任务运行VB脚本链接到数据库。但是现在我们想在项目中创建这个EmailService来获取已经存在的模型和服务。

有人可以就实现这个目标的最佳途径给我一些建议吗?

提前致谢

4 个答案:

答案 0 :(得分:1)

请查看Revalee开源项目。

Revalee是一项服务,允许您安排Web回调到ASP.NET MVC应用程序。 Revalee使用Windows服务管理任务持久性和调度,但利用您的ASP.NET MVC应用程序来处理处理工作(即"工作")。

以下是使用Revalee的MVC应用程序的工作流程:

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

在您的情况下,您将安排将来的回调(当用户提交调查时)以触发您的MVC应用程序中将检查您的调查结果的操作。然后,该检查的结果将触发(或不发送)后续电子邮件消息发送给用户。

<子> <强>&LT;编辑&gt;

要考虑的其他事情......

您可能希望更改处理问题域的方式。而不是安排固定任务&#34;每周一&#34; (即,执行一个同时测试所有调查的过程),翻转处理:单独处理每个调查。可以理解,如果没有像Revalee这样的回调解决方案,这是有问题的。但是使用Revalee,您可以安排每个用户的调查在提交后处理+48小时(例如)。这有两件事:

  1. 它改变了调查检查&#34;工作&#34;从测试所有调查到测试 调查

  2. 它在一周中的所有日子(以及一天中的几小时)展开检查处理。也就是说,它将不再局限于每个星期一正好比如早上8点钟处理。

  3. 要使用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);
    }
    

    48小时后回调MVC应用程序时,SurveyController会使用以下Inspect操作处理回调:

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

    当然,如果您当前的处理工作流程无法从每周一每周发生一次,直到调查提交后的+48小时,那么Revalee仍可用于安排该任务。您的callbackUrl只会是:

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

    <子>&LT; /编辑&gt;

    我希望这会有所帮助。祝你好运!

    免责声明:我是参与Revalee项目的开发人员之一。但需要明确的是,Revalee是免费的开源软件。源代码可在GitHub上找到。

答案 1 :(得分:0)

这里有很多选项,但由于这是一个MVC项目,所以你一定要查看MVC Mailer

这有什么好处,你可以使用母版页作为电子邮件的布局,以及标准的MVC视图作为它的内容。这很容易接线,并且有一些很棒的文档和示例可以帮助您入门。

此外,如果您必须根据发送给他们的用户对电子邮件进行更改,您只需将这些参数添加到提供电子邮件视图的控制器方法中 - 现在您可以根据你在飞行中发送给谁。

除此之外,您只需要一台SMTP服务器来实际发送消息,这听起来就像您已经拥有的那样。

答案 2 :(得分:0)

我建议你使用FluentScheduler。

使用fluent界面配置计划的任务计划程序。用于从应用程序运行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

答案 3 :(得分:0)

触发自动电子邮件的简单控制台应用程序怎么样?我的建议是使用控制台应用程序或计划每周一由主机系统的调度软件(Windows任务计划程序,cron等)运行的Windows服务。

Herehere是与您类似的要求的有趣讨论。