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

C# Visual Studio 2013中MVC项目中的自动电子邮件,c#,asp.net-mvc,scheduled-tasks,scheduler,C#,Asp.net Mvc,Scheduled Tasks,Scheduler,各位 我们最近刚刚发布了一个调查应用程序,它的MVC使用LINQtoEntity 我们有一张SurveyStatus表 每周一,我们都要运行一个自动查询,检查调查是否完成。如果调查完成,则发送电子邮件通知用户 之前,我们使用一个调度任务来完成这项工作,该任务运行一个VB脚本来链接到数据库。不过,现在我们想在项目中创建此EmailService,以获取已有模型和服务的建议 有谁能给我一些建议,告诉我实现这一目标的最佳方法吗 提前感谢您在这里有很多选择,但由于这是一个MVC项目,您一定要查看 这样做

各位

我们最近刚刚发布了一个调查应用程序,它的MVC使用LINQtoEntity

我们有一张SurveyStatus表

每周一,我们都要运行一个自动查询,检查调查是否完成。如果调查完成,则发送电子邮件通知用户

之前,我们使用一个调度任务来完成这项工作,该任务运行一个VB脚本来链接到数据库。不过,现在我们想在项目中创建此EmailService,以获取已有模型和服务的建议

有谁能给我一些建议,告诉我实现这一目标的最佳方法吗


提前感谢

您在这里有很多选择,但由于这是一个MVC项目,您一定要查看

这样做的好处是,您可以使用母版页作为电子邮件的布局,使用标准MVC视图作为电子邮件的内容。连接起来很容易,有一些很好的文档和示例可以帮助您入门

此外,如果您必须根据发送电子邮件的用户对电子邮件进行更改,您只需将这些参数添加到为电子邮件视图提供服务的控制器方法中即可-现在您可以随时根据发送对象对内容进行格式化

除此之外,您所需要的只是一个SMTP服务器来实际发送邮件,听起来您已经有了这个服务器。

请看一下开源项目

Revalee是一种允许您计划对ASP.NET MVC应用程序的web回调的服务。Revalee使用Windows服务管理任务持久性和调度,但利用ASP.NET MVC应用程序处理处理工作(即“工作”)

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


(来源:)

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

<>别的事情要考虑……/P> 您可能希望改变处理问题域的方式。与其“每周一”安排一个固定的任务(也就是说,执行一个同时测试所有调查的流程),不如改变处理方式:单独处理每个调查。不难理解,如果没有像Revalee这样的回调解决方案,这是有问题的。但使用Revalee,您可以安排每个用户的调查在提交后48小时内(例如)进行处理。这有两个作用:

  • 它将测量检查“工作”从测试所有测量更改为测试一个测量

  • 它将检查过程分散到一周中的所有日子(以及一天中的各个小时)。也就是说,它将不再局限于每周一上午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();
    }
    
    当然,如果您当前的处理工作流无法从每周周一发生一次更改为在调查提交后48小时内发生,那么Revalee仍然可以用于安排该任务。您的
    callbackUrl
    将是:

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

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


    免责声明:我是参与Revalee项目的开发人员之一。不过,要明确的是,Revalee是免费的开源软件。源代码在上提供。

    我建议您使用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;
    公共类MyRegistry:注册表
    {
    公共注册处()
    {
    //计划一个ITask以一定的间隔运行
    时间表().ToRunNow().AndEvery(2.Seconds();
    //将ITask计划为运行一次,并按特定的时间间隔延迟。
    时间表().Torunancein(5.s();
    //安排一个简单任务在特定时间运行
    Schedule(()=>Console.WriteLine(“定时任务-将在每天晚上9:15运行:“+DateTime.Now”).ToRunEvery(1.Days().at(21,15));
    //计划一个更复杂的操作,以便立即并每月运行一次
    附表(()=>
    {
    WriteLine(“复杂操作任务开始:“+DateTime.Now”);
    睡眠(1000);
    WriteLine(“复杂操作任务结束:“+DateTime.Now”);
    }).ToRunNow().AndEvery(1.Months())。在第一天(星期一的第二天)。在(3,0);
    //计划在一个计划中运行多个任务
    时间表()和第二个()和第五个()和第五个()分钟();
    }
    } 
    

    一个简单的控制台应用程序如何触发您的自动电子邮件?我的建议是使用控制台应用程序或由主机系统的调度软件(windows任务调度器、cron等)安排在每周一运行的windows服务


    这是一个关于类似需求的有趣讨论。

    对此相当棘手。为什么不使用.Net代码的副本,让一个预定的PowerShell脚本来完成这项工作呢?