【问题标题】:Sending Newsletter using template .Net Core使用模板 .Net Core 发送时事通讯
【发布时间】:2018-08-16 09:47:19
【问题描述】:

我的任务是设置一种方式,让管理员用户可以轻松地挑选文章发送给订阅者列表。下图是我正在尝试创建的,但我的问题是如何通过电子邮件发送视图。我将它创建为静态模板和剃刀模板。我尝试使用RazorEngineRazorlight,但无法弄清楚。

我在这方面看到的很多问题只会在电子邮件中添加一个项目。例如herehere。我正在使用MailKit 发送电子邮件,但对于我的一生,我无法弄清楚如何获得像上面这样的电子邮件正文。我的代码是这样的

   var mimeMessage = new MimeMessage();
            mimeMessage.From.Add(new MailboxAddress("email", "intranet@domain.com"));
            foreach (var item in contacts)
            {
                mimeMessage.To.Add(new MailboxAddress(ToAdressTitle, string.Join(",", item.Email.ToString())));
            }
            mimeMessage.Subject = Subject;
            var builder = new BodyBuilder();
            foreach (var item in post)
            {
                // Set the plain-text version of the message text
                builder.TextBody = item.Intro;
                 var ContentId = MimeUtils.GenerateMessageId();
                // Set the html version of the message text
                builder.HtmlBody = string.Format(item.Intro,@"<img src=""cid:{0}"">", item.FeaturedImage);
                // Now we just need to set the message body and we're done
                mimeMessage.Body = builder.ToMessageBody();
            }

我可以得到我想要的这样的布局吗?

【问题讨论】:

  • 那么具体的问题是什么?我们无法帮助您“弄清楚” Razor,您需要教程或书籍。如果您发布一个问题,我们可以帮助您找出具体问题。没有 Razor 的方法似乎是一个简单的循环。同样,我们无法帮助您“弄清楚”。我们只能帮助您解决具体的问题。你到底在坚持什么?
  • 我知道 Razor,我并没有要求弄清楚 Razor。我问我可以得到我想要的布局来发送通讯。我可以在 Razor 中创建布局,这很容易,但我无法通过电子邮件发送。电子邮件只能是纯文本或 html
  • 我不确定我是否理解问题出在哪里。我以为您想要发送 HTML?您的列表看起来像是 HTML。
  • 好的,我可以在剃刀视图中创建我想要的布局,但我不知道如何在 HTML 电子邮件中发送视图。
  • 简单来说,您需要将 Razor 视图呈现为字符串,然后将其作为电子邮件的 HTML 正文发送。但是,将 Razor 视图呈现为字符串并非易事,并且超出了 Stack Overflow 的范围。您需要对此进行自己的研究。粗略的搜索返回了许多在线示例。就个人而言,我更喜欢轻量级的电子邮件,只在基本的*.html 文件(实际上是通过 MJML 生成)上使用 Handlebars.Net。

标签: c# asp.net-core html-email razorengine


【解决方案1】:

经过长时间的搜索,我发现了这个answer,这使我能够得到我正在寻找的答案。首先我将此代码添加到我的构造函数中

 public class PostsController : Controller
{
        private ICompositeViewEngine _viewEngine;

       public PostsController(ICompositeViewEngine viewEngine)
       {
           _viewEngine = viewEngine;
       }

 } 

要将视图呈现为字符串,我使用此函数

       private async Task<string> RenderViewToString(string viewName, object model)
    {
        if (string.IsNullOrEmpty(viewName))
            viewName = ControllerContext.ActionDescriptor.ActionName;

        ViewData.Model = model;

        using (var writer = new StringWriter())
        {
            ViewEngineResult viewResult =
                _viewEngine.FindView(ControllerContext, viewName, false);

            ViewContext viewContext = new ViewContext(
                ControllerContext,
                viewResult.View,
                ViewData,
                TempData,
                writer,
                new HtmlHelperOptions()
            );

            await viewResult.View.RenderAsync(viewContext);

            return writer.GetStringBuilder().ToString();
        }
    }

我这样称呼它var renderedView = await RenderViewToString("NameOfView", Model); 模型是我要显示的数据。

var mimeMessage = new MimeMessage();
        mimeMessage.From.Add(new MailboxAddress("email", "intranet@domain.com"));
        foreach (var item in contacts)
        {
            mimeMessage.To.Add(new MailboxAddress(ToAdressTitle, string.Join(",", item.Email.ToString())));
        }
        mimeMessage.Subject = Subject;
        var builder = new BodyBuilder();                                             
            // Set the html version of the message text
            builder.HtmlBody = renderedView;
            // Now we just need to set the message body and we're done
            mimeMessage.Body = builder.ToMessageBody();

这使我能够获得所需的视图。

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 2012-01-07
    • 2013-11-10
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2012-06-25
    • 2011-09-11
    • 2012-01-08
    相关资源
    最近更新 更多