如何使用SendGrid + MVC4将.cshtml呈现为Email Body?

时间:2016-08-08 10:09:20

标签: asp.net-mvc email asp.net-mvc-4

我正在尝试发送电子邮件,我可以发送正常的电子邮件。 但现在我已经在电子邮件中发送了一个模板(.cshtml)。

请告诉我如何做到这一点。

这是我的代码:

控制器:

public ActionResult SendEmailDeviceInfoDisplay(List<String> deviceDatailData)
{
    string body = "";
    var emailContoller = new EmailController();
    string email = deviceDatailData[9];
    body = "<html>Event Name: " + deviceDatailData[0] +"</html>";

    var sendEmail = emailContoller.SendDeviceAndEventInfoMail(email, body);
    ViewBag.info = deviceDatailData[8];
    return PartialView("SendEmailConformationDisplay");
}

SendGrid方法:

public string SendDeviceAndEventInfoMail(string email, string body)
{
    var myMessage = new SendGridMessage();
    myMessage.From = new MailAddress("anita.mehta@test.com");
    List<String> recipients = new List<String> { email };
    myMessage.AddTo(recipients);
    myMessage.Subject = "Information";
    myMessage.Html = body;
    var transportWeb = new Web(nc);
    transportWeb.Deliver(myMessage);
    return "done";
}

Ajax致电:

$(function () {
    var loggedInEmailId = $('#buildingSession').val();
    $('#sendAsEmailDeviceConformationDialog').dialog({
        autoOpen: false,
        width: '27.5em',
        position: { my: 'top', at: 'top+150' },
        opacity: 100,
        resizable: false,
        //title: 'Product',
        modal: true,
        closeOnEscape: false,
        open: function (event, ui) {
            $(".ui-dialog-titlebar-close", ui.dialog | ui).hide();

            $.ajax({
                url: '/Overview/SendEmailDeviceInfoDisplay',
                traditional: true,
                data: data,                    
                success: function (result) {
                    $('.ui-button-text').hide();
                    $('#sendAsEmailDeviceConformationDialog').html(result);
                },
                error: function () {
                }
            });
        }
    });
}

1 个答案:

答案 0 :(得分:1)

我之前有类似的要求,虽然有可能我发现更多的问题然后它是值得的所以我采取了不同的方式。虽然这不能直接回答你的问题,但它是解决问题的另一种方法。

基本思想是避免使用cshtml的复杂性。所以我使用了以下基本的POCO对象并将其存储在数据库中:

public interface IEmailTemplate
{
    ... other db related fields
    string Name { get; set; }
    string FromEmail { get; set; }
    string FromDisplayName { get; set; }
    string Subject { get; set; }
    string TextMessage { get; set; }
    string HtmlMessage { get; set; }
    EmailPriority Priority { get; set; }
}

这使我可以管理电子邮件而无需重新编译和重新部署项目。

当我需要使用它时,我加载模板并构建电子邮件消息。为了帮助我,我使用SmartFormat.NET使用以下逻辑进行数据替换:

    private string DataReplacements(string input, object args)
    {
        if (input.IsNullOrEmptyOrBlank())
        {
            return string.Empty;
        }
        return args != null ? Smart.Default.Format(input, args) : input;
    }

    subject = DataReplacements(template.Subject, dataModel);
    textMessage = DataReplacements(template.TextMessage, dataModel);
    htmlMessage = DataReplacements(template.HtmlMessage, dataModel);

同样,虽然没有回答你的直接问题,但这条道路给了我更大的灵活性,没有麻烦。