0

我正在尝试在我的 MVC 项目中发送格式化的电子邮件。我在我的 BaseService 类中使用此方法完美发送了普通电子邮件,所有其他服务都继承自:

public void SendAsyncEmail(MailMessage message)
        {
            var client = new SmtpClient("smtp.gmail.com", 587)
            {
                Credentials = new NetworkCredential("cred", "password"),
                EnableSsl = true
            };
            client.SendCompleted += (s, e) =>
            {
                client.Dispose();
                message.Dispose();
            };
            ThreadPool.QueueUserWorkItem(o => client.SendAsync(message, Tuple.Create(client, message)));
        }

现在,我需要将每个 MailMessage.Body 转换为 HTML 页面,而不是纯文本正文,最好使用 Razor 模板。我找到了 MVCMailer:

https://github.com/smsohan/MvcMailer/wiki/MvcMailer-Step-by-Step-Guide

我安装了它,搭建了一些模板,并在我的 BaseService 中添加了以下内容:

public virtual MvcMailMessage Welcome()
    {
        ViewBag.Name = "Test";
        return Populate(x =>
        {
            x.viewName = "Welcome";
            x.To.Add("sohan39@example.com");
        });
    }

但是我的服务没有 HTTPContext,所以 ViewBag 没有解析(也没有填充)。

让这个工作最简单的方法是什么?

4

1 回答 1

1

您将 Razor 与 MVC 视图混淆了。Razor 只是一种模板语言,它本身并没有 HttpContext 的概念,也不应该有。视图在请求周期中接收 HttpContext 因为它是一个 Web 请求,但是如果您在请求周期之外使用 Razor,那么您就没有这个。因此,最简单的解决方案就是不使用 ViewBag。就个人而言,我会说即使您确实有 HttpContext 可供您使用,建议也应该适用,但这不是重点。

我对 MvcMailer 并不太熟悉;我自己使用邮政。但是,我相信校长基本上是一样的。您将模型或对象传递到邮件渲染中,然后您就可以在视图中访问该数据。因此,不要使用 ViewBag,而是直接传递数据。如果 MvcMailer 不能将任意数据添加到它的视图上下文中(我会觉得很奇怪),那么试试 Postal。使用 Postal,您可以创建一个Postal.Email包含您喜欢的任何数据的子类。它的功能类似于视图模型。然后,您可以将视图强输入到此模型中,并在完全智能感知支持的情况下在视图中使用它。如果您需要操作中的一些信息,只需将其传递给您的模型以获取视图:简单。

于 2013-10-21T19:14:00.053 回答