2016-11-28 5 views
2

Hoffe, dass ich meinen Antrag auf einfache Weise erklären kann:E-Mail gesendet werden, resultierte Rasiermesser Blick in MailKit

In .Net-Core können wir die .cshtml Ansicht angezeigt werden, nachdem die Modelldaten View(FileName, Model) mit senden.

Gibt es eine Möglichkeit, die Model an die .cshtml Datei zu senden, so dass statt der resultierenden Ansicht anzeigt ich es eine Befestigung Mailkit

Antwort

6

Dank Paris Polyzos und seine article mit per E-Mail.

Ich fand die Lösung, so gerne, um es zu teilen, kann jemand einen Nutzen davon bekommen, oder verbessern Sie es.

Firs: Wir brauchen service zu erstellen, um die Rasor in String zu konvertieren, wird der Code Razor2String.cs unter:

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(); 
            } 
        } 
    } 
} 

Zweitens: Wir müssen die "preserveCompilationContext": true zum buildOptions hinzuzufügen, so dass die project.json werden:

{ 
    "version": "1.0.0-*", 
    "buildOptions": { 
    "debugType": "portable", 
    "emitEntryPoint": true, 
    "preserveCompilationContext": true 
    }, 
    "dependencies": { 
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.1", 
    "Microsoft.AspNetCore.Mvc": "1.0.1", 
    "MailKit":"1.10.0" 
    }, 
    "frameworks": { 
    "netcoreapp1.0": { 
     "dependencies": { 
     "Microsoft.NETCore.App": { 
      "type": "platform", 
      "version": "1.0.1" 
     } 
     }, 
     "imports": "dnxcore50" 
    } 
    } 
} 

Drittens: Wir müssen die service zum ConfigureServices in der Startup Klasse hinzuzufügen, so dass die Startup.cs Datei werden:

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")); 
      }); 
     } 
    } 

Viertens: Definieren Sie Ihre Model, so etwas wie users.cs:

namespace myApp 
{ 
    public class users { 
     public string UserId {get; set;} 
     public string UserName {get; set;} 
    } 
} 

Fünftens: Erstellen Sie die View Vorlage, in der Views Ordner, so etwas wie Views/Razor2String.cshtml:

Hello 
<hr/> 

@{ 
    ViewData["Title"] = "Contact"; 
} 
<h2>@ViewData["Title"].</h2> 
<h3>user id: @Model.UserId</h3> 

Sechstens: Die Program.cs ist einfach wie folgt:

using System.IO; 
using Microsoft.AspNetCore.Builder; 
using Microsoft.AspNetCore.Hosting; 

namespace myApp 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      var host = new WebHostBuilder() 
       .UseContentRoot(Directory.GetCurrentDirectory()) 
       .UseKestrel() 
       .UseUrls("http://localhost:50000") 
       .UseStartup<Startup>() 
       .Build(); 
      host.Run(); 
     } 
    } 
} 

Siebtens: Der Hauptteil, '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", "[email protected]")); 
      message.To.Add(new MailboxAddress("Personal", "[email protected]")); 
      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("[email protected]", "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); 
       } 
     } 
    } 
} 

Wenn Sie die Zeichenfolge müssen zurückgeschickt für den Browser, können Sie verwenden:

[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); 
    } 

Wenn Sie müssen das Ergebnis auf AJAX-Anforderung senden, können Sie so etwas wie verwenden:

public async Task<String> RenderInviteView() 
{ 
. 
. 
. 
return result; 
} 

Wenn Sie möchten, Um eine separate Methode zu haben, um die Zeichenkette in einen Strom wie GenerateStreamFromString(result) zu konvertieren, können Sie sie unter Verwendung von using (Stream stream = GenerateStreamFromString(result)){ }

anrufen
Verwandte Themen