使用MailKit中的razor视图发送电子邮件

使用MailKit中的razor视图发送电子邮件,razor,.net-core,mailkit,Razor,.net Core,Mailkit,希望我能用一种简单的方式解释我的要求: 在.NETCore中,使用视图(文件名,模型)发送模型数据后,我们可以显示.cshtml视图 有没有办法将模型发送到.cshtml文件,这样我就不用显示结果视图,而是通过电子邮件发送了一个附件,使用Mailkit感谢您和他的帮助 我找到了解决方案,所以很乐意与大家分享,也许有人会从中受益,或者改进它 首先:我们需要创建服务将Rasor转换为字符串,代码Razor2String.cs如下: using System using System.IO; usin

希望我能用一种简单的方式解释我的要求:

在.NETCore中,使用
视图(文件名,模型)
发送模型数据后,我们可以显示
.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;
}