使用MailKit中的razor视图发送电子邮件
希望我能用一种简单的方式解释我的要求: 在.NETCore中,使用使用MailKit中的razor视图发送电子邮件,razor,.net-core,mailkit,Razor,.net Core,Mailkit,希望我能用一种简单的方式解释我的要求: 在.NETCore中,使用视图(文件名,模型)发送模型数据后,我们可以显示.cshtml视图 有没有办法将模型发送到.cshtml文件,这样我就不用显示结果视图,而是通过电子邮件发送了一个附件,使用Mailkit感谢您和他的帮助 我找到了解决方案,所以很乐意与大家分享,也许有人会从中受益,或者改进它 首先:我们需要创建服务将Rasor转换为字符串,代码Razor2String.cs如下: using System using System.IO; usin
视图(文件名,模型)
发送模型数据后,我们可以显示.cshtml
视图
有没有办法将模型
发送到.cshtml
文件,这样我就不用显示结果视图,而是通过电子邮件发送了一个附件,使用Mailkit
感谢您和他的帮助
我找到了解决方案,所以很乐意与大家分享,也许有人会从中受益,或者改进它
首先:我们需要创建服务
将Rasor转换为字符串,代码Razor2String.cs
如下:
using System
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Routing;
namespace Project.Utilities
{
public interface IViewRenderService
{
Task<string> RenderToStringAsync(string viewName, object model);
}
public class ViewRenderService : IViewRenderService
{
private readonly IRazorViewEngine _razorViewEngine;
private readonly ITempDataProvider _tempDataProvider;
private readonly IServiceProvider _serviceProvider;
public ViewRenderService(IRazorViewEngine razorViewEngine,
ITempDataProvider tempDataProvider,
IServiceProvider serviceProvider)
{
_razorViewEngine = razorViewEngine;
_tempDataProvider = tempDataProvider;
_serviceProvider = serviceProvider;
}
public async Task<string> RenderToStringAsync(string viewName, object model)
{
var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };
var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
using (var sw = new StringWriter())
{
var viewResult = _razorViewEngine.FindView(actionContext, viewName, false);
if (viewResult.View == null)
{
throw new ArgumentNullException($"{viewName} does not match any available view");
}
var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
{
Model = model
};
var viewContext = new ViewContext(
actionContext,
viewResult.View,
viewDictionary,
new TempDataDictionary(actionContext.HttpContext, _tempDataProvider),
sw,
new HtmlHelperOptions()
);
await viewResult.View.RenderAsync(viewContext);
return sw.ToString();
}
}
}
}
第三:我们需要将服务
添加到Startup
类中的ConfigureServices
,以便Startup.cs
文件成为:
using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Project.Utilities;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
// Add application services.
services.AddScoped<IViewRenderService, ViewRenderService>();
}
public void Configure(IApplicationBuilder app)
{
app.UseMvc();
app.Run(async (context) =>
{
await context.Response.WriteAsync(
"Hello World of the last resort. The Time is: " +
DateTime.Now.ToString("hh:mm:ss tt"));
});
}
}
第五:在视图
文件夹中创建视图
模板,类似于视图/Razor2String.cshtml
:
Hello
<hr/>
@{
ViewData["Title"] = "Contact";
}
<h2>@ViewData["Title"].</h2>
<h3>user id: @Model.UserId</h3>
第七:主要部分“Email.cs”:
using System;
using System.IO;
using Microsoft.AspNetCore.Mvc;
using Project.Utilities;
using System.Threading.Tasks;
using MailKit.Net.Smtp; // for SmtpClient
using MimeKit; // for MimeMessage, MailboxAddress and MailboxAddress
namespace myApp
{
[Route("api")]
public class RenderController : Controller
{
private readonly IViewRenderService _viewRenderService;
public RenderController(IViewRenderService viewRenderService)
{
_viewRenderService = viewRenderService;
}
[Route("sendEmail")]
public async Task sendEmail()
{
var viewModel = new users
{
UserId = "cdb86aea-e3d6-4fdd-9b7f-55e12b710f78",
UserName = "iggy",
};
// Get the generated Razor view as String
var result = await _viewRenderService.RenderToStringAsync("Razor2String", viewModel);
MemoryStream stream = new MemoryStream ();
StreamWriter writer = new StreamWriter(stream);
writer.Write((String)result);
writer.Flush();
stream.Position = 0;
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Hasan Yousef", "mySelf@gmail.com"));
message.To.Add(new MailboxAddress("Personal", "myPersonalEmail@gmail.com"));
message.Subject = "Email Test";
var bodyBuilder = new BodyBuilder();
bodyBuilder.HtmlBody = @"<div>HTML email body</Div>";
bodyBuilder.Attachments.Add ("msg.html", stream);
message.Body = bodyBuilder.ToMessageBody();
using (var client = new SmtpClient())
{
client.Connect("smtp.gmail.com", 587);
client.AuthenticationMechanisms.Remove("XOAUTH2"); // due to enabling less secure apps access
Console.WriteLine("Prepairing the Email");
try{
client.Authenticate("mySelf@gmail.com", "myPSWD");
Console.WriteLine("Auth Completed");
}
catch (Exception e){
Console.WriteLine("ERROR Auth");
}
try{
client.Send(message);
Console.WriteLine("Email had been sent");
}
catch (Exception e){
Console.WriteLine("ERROR");
}
client.Disconnect(true);
}
}
}
}
使用系统;
使用System.IO;
使用Microsoft.AspNetCore.Mvc;
使用项目.公用设施;
使用System.Threading.Tasks;
使用MailKit.Net.Smtp;//对于SmtpClient
使用MimeKit;//对于mimessage、MailboxAddress和MailboxAddress
名称空间myApp
{
[路线(“api”)]
公共类RenderController:控制器
{
私有只读IViewRenderService _viewRenderService;
公共渲染控制器(IViewRenderService viewRenderService)
{
_viewRenderService=viewRenderService;
}
[发送路线(“发送电子邮件”)]
公共异步任务sendEmail()
{
var viewModel=新用户
{
UserId=“cdb86aea-e3d6-4fdd-9b7f-55e12b710f78”,
UserName=“iggy”,
};
//以字符串形式获取生成的Razor视图
var result=wait_viewRenderService.RenderToStringAsync(“Razor2String”,viewModel);
MemoryStream stream=新的MemoryStream();
StreamWriter writer=新StreamWriter(流);
writer.Write((字符串)结果);
writer.Flush();
流位置=0;
var message=new mimessage();
message.From.Add(新邮箱地址(“Hasan Yousef”)mySelf@gmail.com"));
message.To.Add(新邮箱地址(“个人”)myPersonalEmail@gmail.com"));
message.Subject=“电子邮件测试”;
var bodyBuilder=新的bodyBuilder();
bodyBuilder.HtmlBody=@“HTML电子邮件正文”;
bodyBuilder.Attachments.Add(“msg.html”,stream);
message.Body=bodyBuilder.ToMessageBody();
使用(var client=new SmtpClient())
{
client.Connect(“smtp.gmail.com”,587);
client.authenticationMechaniss.Remove(“XOAUTH2”);//由于启用了不太安全的应用程序访问
Console.WriteLine(“准备电子邮件”);
试一试{
客户端身份验证(“mySelf@gmail.com“,“myPSWD”);
Console.WriteLine(“验证完成”);
}
捕获(例外e){
Console.WriteLine(“错误验证”);
}
试一试{
客户端。发送(消息);
Console.WriteLine(“已发送电子邮件”);
}
捕获(例外e){
控制台写入线(“错误”);
}
client.Disconnect(true);
}
}
}
}
如果需要将字符串发送回浏览器,可以使用:
[Route("returnView")]
public async Task<IActionResult> returnView()
{
var viewModel = new users
{
UserId = "cdb86aea-e3d6-4fdd-9b7f-55e12b710f78",
UserName = "iggy",
};
// Get the generated Razor view as String
var result = await _viewRenderService.RenderToStringAsync("Razor2String", viewModel);
return Content(result);
}
[路线(“返回视图”)]
公共异步任务returnView()
{
var viewModel=新用户
{
UserId=“cdb86aea-e3d6-4fdd-9b7f-55e12b710f78”,
UserName=“iggy”,
};
//以字符串形式获取生成的Razor视图
var result=wait_viewRenderService.RenderToStringAsync(“Razor2String”,viewModel);
返回内容(结果);
}
如果需要将结果发送到AJAX请求,可以使用以下方法:
public async Task<String> RenderInviteView()
{
.
.
.
return result;
}
public异步任务renderinview()
{
.
.
.
返回结果;
}
如果希望使用单独的方法将字符串转换为流,如GenerateStreamFromString(result)
,则可以使用using(stream-stream=GenerateStreamFromString(result)){}
using System;
using System.IO;
using Microsoft.AspNetCore.Mvc;
using Project.Utilities;
using System.Threading.Tasks;
using MailKit.Net.Smtp; // for SmtpClient
using MimeKit; // for MimeMessage, MailboxAddress and MailboxAddress
namespace myApp
{
[Route("api")]
public class RenderController : Controller
{
private readonly IViewRenderService _viewRenderService;
public RenderController(IViewRenderService viewRenderService)
{
_viewRenderService = viewRenderService;
}
[Route("sendEmail")]
public async Task sendEmail()
{
var viewModel = new users
{
UserId = "cdb86aea-e3d6-4fdd-9b7f-55e12b710f78",
UserName = "iggy",
};
// Get the generated Razor view as String
var result = await _viewRenderService.RenderToStringAsync("Razor2String", viewModel);
MemoryStream stream = new MemoryStream ();
StreamWriter writer = new StreamWriter(stream);
writer.Write((String)result);
writer.Flush();
stream.Position = 0;
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Hasan Yousef", "mySelf@gmail.com"));
message.To.Add(new MailboxAddress("Personal", "myPersonalEmail@gmail.com"));
message.Subject = "Email Test";
var bodyBuilder = new BodyBuilder();
bodyBuilder.HtmlBody = @"<div>HTML email body</Div>";
bodyBuilder.Attachments.Add ("msg.html", stream);
message.Body = bodyBuilder.ToMessageBody();
using (var client = new SmtpClient())
{
client.Connect("smtp.gmail.com", 587);
client.AuthenticationMechanisms.Remove("XOAUTH2"); // due to enabling less secure apps access
Console.WriteLine("Prepairing the Email");
try{
client.Authenticate("mySelf@gmail.com", "myPSWD");
Console.WriteLine("Auth Completed");
}
catch (Exception e){
Console.WriteLine("ERROR Auth");
}
try{
client.Send(message);
Console.WriteLine("Email had been sent");
}
catch (Exception e){
Console.WriteLine("ERROR");
}
client.Disconnect(true);
}
}
}
}
[Route("returnView")]
public async Task<IActionResult> returnView()
{
var viewModel = new users
{
UserId = "cdb86aea-e3d6-4fdd-9b7f-55e12b710f78",
UserName = "iggy",
};
// Get the generated Razor view as String
var result = await _viewRenderService.RenderToStringAsync("Razor2String", viewModel);
return Content(result);
}
public async Task<String> RenderInviteView()
{
.
.
.
return result;
}