2014-07-03 35 views
2

民間,Visual Studio 2013中的MVC項目中的自動電子郵件

我們剛剛推出了一個調查應用程序,它的MVC使用LINQ to entity。

我們有一個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應用程序安排Web回調。 Revalee使用Windows服務管理任務持久性和調度,但利用ASP.NET MVC應用程序處理處理工作(即「工作」)。

下面是使用Revalee MVC應用程序的工作流程:

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任務計劃程序,cron等)每週一運行的Windows服務。

Herehere是一個有趣的討論像您的類似要求。

相關問題