Asp.net core 学习笔记 ( Smtp and Razor template 电子邮件和 Razor 模板 )
refer :
https://dotnetcoretutorials.com/2017/08/20/sending-email-net-core-2-0/
https://ppolyzos.com/2016/09/09/asp-net-core-render-view-to-string/
https://github.com/aspnet/Entropy/blob/dev/samples/Mvc.RenderViewToString/RazorViewToStringRenderer.cs ( 这个很干净, 没有依赖 http request )
直接看代码
要使用 Razor 模板需要提供这 2 个 服务
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<ICompositeViewEngine, CompositeViewEngine>();
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
}
Controller 注入相关服务
public class EmailController : Controller
{
public EmailController(
IOptionsSnapshot<Configuration.Email> emailOptionsAccessor,
ICompositeViewEngine compositeViewEngine,
IActionContextAccessor actionContextAccessor
)
{
emailConfig = emailOptionsAccessor.Value;
this.compositeViewEngine = compositeViewEngine;
actionContext = actionContextAccessor.ActionContext;
} private Configuration.Email emailConfig { get; set; }
private ICompositeViewEngine compositeViewEngine { get; set; }
private ActionContext actionContext { get; set; } }
最后呢
SmtpClient client = new SmtpClient
{
EnableSsl = emailConfig.enableSsl,
Port = emailConfig.port,
Host = emailConfig.host,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(emailConfig.username, emailConfig.password)
}; string body;
using (StringWriter sw = new StringWriter())
{
EmailTemplateViewmodel model = new EmailTemplateViewmodel
{
value = "dada"
};
ViewData.Model = model;
ViewEngineResult viewResult = compositeViewEngine.GetView(
null,
"~/Email/EmailTemplate.cshtml",
false
);
ViewContext viewContext = new ViewContext(actionContext, viewResult.View, ViewData, TempData, sw, new HtmlHelperOptions());
await viewResult.View.RenderAsync(viewContext);
body = sw.GetStringBuilder().ToString();
} MailMessage mailMessage = new MailMessage
{
From = new MailAddress(emailConfig.from, emailConfig.displayName),
Subject = "subject",
Body = body,
IsBodyHtml = true
};
mailMessage.To.Add("hengkeat87@gmail.com");
await client.SendMailAsync(mailMessage);
上面的依赖当前的请求
如果要不依赖请求的
注入
IServiceProvider serviceProvider,
ITempDataProvider tempDataProvider
private async Task<string> GenerateBodyFromTemplateAsync(string templatePath, object model)
{
string body;
using (StringWriter sw = new StringWriter())
{
// 这里渲染模板是不包含任何 http 请求的东西的, 所以模板里请不要使用 http 的东西哦
var httpContext = new DefaultHttpContext();
httpContext.RequestServices = ServiceProvider;
var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
var viewData = new ViewDataDictionary(metadataProvider: new EmptyModelMetadataProvider(), modelState: new ModelStateDictionary());
viewData.Model = model;
var data = new TempDataDictionary(actionContext.HttpContext, TempDataProvider);
var viewResult = CompositeViewEngine.GetView(null, templatePath, false);
var viewContext = new ViewContext(actionContext, viewResult.View, viewData, data, sw, new HtmlHelperOptions());
await viewResult.View.RenderAsync(viewContext);
body = sw.GetStringBuilder().ToString();
}
return body;
}
Asp.net core 学习笔记 ( Smtp and Razor template 电子邮件和 Razor 模板 )的更多相关文章
- Asp.Net Core学习笔记:入门篇
Asp.Net Core 学习 基于.Net Core 2.2版本的学习笔记. 常识 像Django那样自动检查代码更新,自动重载服务器(太方便了) dotnet watch run 托管设置 设置项 ...
- ASP.NET Core 学习笔记 第一篇 ASP.NET Core初探
前言 因为工作原因博客断断续续更新,其实在很早以前就有想法做一套关于ASP.NET CORE整体学习度路线,整体来说国内的环境的.NET生态环境还是相对比较严峻的,但是干一行爱一行,还是希望更多人加入 ...
- Asp.net Core学习笔记
之前记在github上的,现在搬运过来 变化还是很大的,感觉和Nodejs有点类似,比如中间件的使用 ,努力学习ing... 优点 不依赖IIS 开源和跨平台 中间件支持 性能优化 无所不在的依赖注入 ...
- ASP.NET Core 学习笔记 第三篇 依赖注入框架的使用
前言 首先感谢小可爱门的支持,写了这个系列的第二篇后,得到了好多人的鼓励,也更加坚定我把这个系列写完的决心,也能更好的督促自己的学习,分享自己的学习成果.还记得上篇文章中最后提及到,假如服务越来越多怎 ...
- ASP.NET Core 学习笔记 第四篇 ASP.NET Core 中的配置
前言 说道配置文件,基本大多数软件为了扩展性.灵活性都会涉及到配置文件,比如之前常见的app.config和web.config.然后再说.NET Core,很多都发生了变化.总体的来说技术在进步,新 ...
- ASP.NET Core 学习笔记 第五篇 ASP.NET Core 中的选项
前言 还记得上一篇文章中所说的配置吗?本篇文章算是上一篇的延续吧.在 .NET Core 中读取配置文件大多数会为配置选项绑定一个POCO(Plain Old CLR Object)对象,并通过依赖注 ...
- Asp.net core 学习笔记 ( Data protection )
参考 : http://www.cnblogs.com/xishuai/p/aspnet-5-identity-part-one.html http://cnblogs.com/xishuai/p/a ...
- Asp.net core 学习笔记 SignalR
refer : https://kimsereyblog.blogspot.com/2018/07/signalr-with-asp-net-core.html https://github.com/ ...
- Asp.net core (学习笔记 路由和语言 route & language)
https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.1 https://doc ...
随机推荐
- Java中Integer和int的异同
public void Test1() { int a = 128; Integer b = 128; Integer c = 128; //Integer会自动拆箱成int,所以为ture Syst ...
- Ubuntu系统启动后停在(initramfs)
问题 今天我在启动虚拟机过程 遇到莫名其妙的问题,启动不了.如下图.提示某个文件系统错误了.例如我的就是 /dev/mapper/vagrant--vg-root . 上面问题 可把我急坏了,以为虚拟 ...
- LaTeX参考文献出现问号
自己用LaTeX编辑,忘记在\end{document}前面放: \bibliographystyle{ieeetr}\bibliography{sample-bibliography} 导致这个现象 ...
- javaweb(2)之Servlet入门
Hello Servlet 方式一 1.新建 web 工程,编写一个类,实现 javax.servlet.Servlet 接口: package com.zze.servlet; import jav ...
- nodejs 之=> 函数
基本用法: ES6中允许使用“箭头”(=>)定义函数 var f = v => v; 上面代码相当于定义了一个函数 f : var f = function(v){ return v; } ...
- swagger:API在线文档自动生成框架
传统的API从开发测试开始我们经常借用类似Postman.fiddle等等去做接口测试等等工具:Swagger 为API的在线测试.在线文档提供了一个新的简便的解决方案: NET 使用Swagger ...
- js 执行机制
浏览器中每个一个窗口都是一个单独的进程.这就需要分析浏览器与Javascript解释引擎之间的关系.先给出结论,浏览器本身是多线程的,Javascript解释引擎是单线程的. 先说说浏览器有哪些线程, ...
- python多线程学习一
本文希望达到的目标: 多线程的基本认识 多线程编程的模块和类的使用 Cpython的全局解释器锁GIL 一.多线程的基本认识 多线程编程的目的:并行处理子任务,大幅度地提升整个任务的效率. 线程就是运 ...
- mysql 试题总结
一.MySQL的复制原理以及流程 1.复制基本原理流程 1.主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中: 2.从:io线程——在使用start sla ...
- qemu 对虚机的地址空间管理
转载:http://huchh.com/2015/06/22/qemu-%E5%AF%B9%E8%99%9A%E6%9C%BA%E7%9A%84%E7%BA%BF%E6%80%A7%E5%9C%B0% ...