2016-08-08 37 views
1

Ich versuche, E-Mail zu senden, normale E-Mail kann ich senden. Aber jetzt habe ich eine Vorlage (.cshtml) in E-Mail senden.Wie man .cshtml als Email-Körper mit SendGrid + MVC4 rendert?

Bitte sagen Sie mir, wie kann ich das tun.

Hier ist mein Code:

Controller:

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 Methode:

public string SendDeviceAndEventInfoMail(string email, string body) 
{ 
    var myMessage = new SendGridMessage(); 
    myMessage.From = new MailAddress("[email protected]"); 
    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"; 
} 

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

Antwort

1

Ich hatte eine ähnliche Anforderung vor und während es möglich ist, ich habe mehr Probleme gefunden, dann war es das wert, also ging ich einen anderen Weg. Während dies Ihre Frage nicht direkt beantwortet, ist es ein alternativer Ansatz für das Problem.

Die Grundidee war, die Komplexität der Verwendung von cshtml zu vermeiden. So habe ich das folgende grundlegende POCO-Objekt und in einer Datenbank gespeichert:

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

Das ist mir die E-Mail ohne neu zu kompilieren und neu bereitstellen, das Projekt zu verwalten.

Wenn ich es verwenden muss, lade ich die Vorlage und baue die E-Mail-Nachricht aus. Um zu helfen mit, dass ich SmartFormat.NET verwenden, um Daten Ersatz zu tun mit der Folgelogik:

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

Wieder während nicht Ihre direkte Frage zu beantworten gab mir diesen Weg viel mehr Flexibilität, ohne den Aufwand.

+0

Danke für die Antwort. Aber für mich keine Notwendigkeit, in der Datenbank zu speichern, habe ich bereits die Daten in meiner Hand, ich muss nur die Daten in .cshtml hinzufügen und diese .cshtml müssen in E-Mail senden. Können Sie mir bitte sagen, ist es möglich und wenn es möglich ist, wie kann ich tun. –

+1

http://mehdi.me/generating-html-emails-with-razorengine-introduction/ –