郵件的內容其實是就HTML,傳統的做法都是通過在程式中拼接字元串來生成郵件的內容,生成困難,維護也困難。Razor是MVC裡面使用的視圖引擎,用來生成HTML非常方便,ZKEACMS中就是使用了Razor視圖引擎,用cshtml作為郵件模板來生成郵件內容。這樣很方便維護和修改。 ...
郵件的內容其實是就HTML,傳統的做法都是通過在程式中拼接字元串來生成郵件的內容,生成困難,維護也困難。Razor是MVC裡面使用的視圖引擎,用來生成HTML非常方便,ZKEACMS中就是使用了Razor視圖引擎,用cshtml作為郵件模板來生成郵件內容。這樣很方便維護和修改。
定義介面 IViewRenderService
介面中定義了兩個方法,第一個是視圖中沒有使用ViewModel,直接傳入視圖路徑就可以了。第二個是視圖中有作用ViewModel,傳入視圖路徑和ViewModel對象就可以。
namespace Easy.Mvc.RazorPages { public interface IViewRenderService { string Render(string viewPath); string Render<Model>(string viewPath, Model model); } }
介面實現 ViewRenderService
實現的方式也比較簡單,主要還是直接使用了RazorViewEngine:
namespace Easy.Mvc.RazorPages { public class ViewRenderService : IViewRenderService { private readonly IRazorViewEngine _viewEngine; private readonly ITempDataProvider _tempDataProvider; private readonly IServiceProvider _serviceProvider; public ViewRenderService(IRazorViewEngine viewEngine, ITempDataProvider tempDataProvider, IServiceProvider serviceProvider) { _viewEngine = viewEngine; _tempDataProvider = tempDataProvider; _serviceProvider = serviceProvider; } public string Render(string viewPath) { return Render(viewPath, string.Empty); } public string Render<TModel>(string viewPath, TModel model) { var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider }; var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); var viewResult = _viewEngine.GetView(null, viewPath, false); if (!viewResult.Success) { throw new InvalidOperationException($"找不到視圖模板 {viewPath}"); } var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary()) { Model = model }; using (var writer = new StringWriter()) { var viewContext = new ViewContext( actionContext, viewResult.View, viewDictionary, new TempDataDictionary(actionContext.HttpContext, _tempDataProvider), writer, new HtmlHelperOptions() ); var render = viewResult.View.RenderAsync(viewContext); render.Wait(); return writer.ToString(); } } } }
使用
使用的方法也很簡單,首先要先建一個郵件模板,例如 ResetPassword.cshtml
代碼如下:
@model ZKEACMS.Notification.ViewModels.ResetPasswordViewModel <!DOCTYPE html> <html class="not-ie" lang="zh"> <head> <title>重置密碼</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> </head> <body> <h3> 您正在重置密碼, </h3> <p> 您可以使用以下鏈接來重置您的密碼,為了安全,該鏈接僅會在一段時間內有效,請儘快重置密碼 </p> <p> <a href="@Model.Link"> @Model.Link </a> </p> <h4> ZKEASOFT </h4> <p> <a href="http://www.zkea.net"> http://www.zkea.net </a> </p> <p> <em>@DateTime.Now.ToString("yyyy-MM-dd")</em> </p> </body> </html>
接下來就是調用ViewRenderService
var htmlContent = _viewRenderService.Render("~/EmailTemplates/ResetPassword.cshtml", new ResetPasswordViewModel{Link=...});
有了內容以後,就可以直接調用發送了。
原文鏈接:http://www.zkea.net/codesnippet/detail/post-62