2015-02-11 86 views
-2

我正在寻找实施SendMail入站分析Webhook,但发现它们提供的示例似乎落后于完美解决方案的很长一段路。如何使用MVC模型绑定从Asp.net MVC中的SendGrid Inbound Parse Webhook获取数据?

https://sendgrid.com/docs/Code_Examples/Webhook_Examples/csharp.html#-Parse-Webhook

[HttpPost] 
public async Task<HttpResponseMessage> Post() 
{ 
    var root = HttpContext.Current.Server.MapPath("~/App_Data"); 
    var provider = new MultipartFormDataStreamProvider(root); 
    await Request.Content.ReadAsMultipartAsync(provider); 

    var email = new Email 
    { 
     Dkim = provider.FormData.GetValues("dkim").FirstOrDefault(), 
     To = provider.FormData.GetValues("to").FirstOrDefault(), 
     Html = provider.FormData.GetValues("html").FirstOrDefault(), 
     From = provider.FormData.GetValues("from").FirstOrDefault(), 
     Text = provider.FormData.GetValues("text").FirstOrDefault(), 
     SenderIp = provider.FormData.GetValues("sender_ip").FirstOrDefault(), 
     Envelope = provider.FormData.GetValues("envelope").FirstOrDefault(), 
     Attachments = int.Parse(provider.FormData.GetValues("attachments").FirstOrDefault()), 
     Subject = provider.FormData.GetValues("subject").FirstOrDefault(), 
     Charsets = provider.FormData.GetValues("charsets").FirstOrDefault(), 
     Spf = provider.FormData.GetValues("spf").FirstOrDefault() 
    }; 

    // The email is now stored in the email variable 

    return new HttpResponseMessage(HttpStatusCode.OK); 
} 

这不使用模型,这似乎我错了任何方式结合。他们的代码也不会从表单数据中提取附件。

所有的建议,例子和帮助非常感谢。

+0

对不起,SendGrid的工作人员告诉我,如果任何人有任何c#代码使用他们的服务的例子,因为我正在与之交谈的人只知道PHP。我会尝试将问题改为更合适的。 – 2015-02-12 03:34:47

+0

如果您将签名更改为公共异步任务发布([FromBody]电子邮件数据)并且读取数据内容,会发生什么? – 2015-02-12 04:53:04

+0

只需添加'[FromBody]'不起作用,它现在不再发现要调用的操作方法。我认为这是因为它在MVC控制器中,而不是WebApi控制器。我将它转换成WebApi控制器,看看是否有帮助。 – 2015-02-12 10:53:57

回答

6

这是我目前用于从.net中的SendGrid入站分析Webhook中提取电子邮件数据的最佳解决方案。

请注意,它使用的是正常的MVC控制器而不是WebApi控制器,因为这些文件似乎并未附加到WebApi控制器中的请求中。

型号:

public class InboundEmailInputModel 
{ 
    public string Headers { get; set; } 
    public string Text { get; set; } 
    public string Html { get; set; } 
    public string From { get; set; } 
    public string To { get; set; } 
    public List<string> Cc { get; set; } 
    public string Subject { get; set; } 
    public string Dkim { get; set; } 
    public string Spf { get; set; } 
    public InboundEmailEnvelopeInputModel Envelope { get; set; } 
    public InboundEmailCharsetsInputModel Charsets { get; set; } 
    public float SpamScore { get; set; } 
    public string SpamReport { get; set; } 
    public int Attachments { get; set; } 
    public dynamic AttachmentInfo { get; set; } 
    public HttpFileCollectionBase AttachmentFiles { get; set; } 
    public string SenderIp { get; set; } 
} 


public class InboundEmailEnvelopeInputModel 
{ 
    public string From { get; set; } 
    public List<string> To { get; set; } 
} 


public class InboundEmailCharsetsInputModel 
{ 
    public string From { get; set; } 
    public string To { get; set; } 
    public string Cc { get; set; } 
    public string Html { get; set; } 
    public string Subject { get; set; } 
    public string Text { get; set; } 
} 

控制器

[System.Web.Mvc.AllowAnonymous] 
    [System.Web.Mvc.HttpPost] 
    public async Task<HttpResponseMessage> Inbound() 
    { 
     var inboundEmail = await InboundEmailExtractor.ExtractInboundEmail(Request); 

     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 

静态方法

public static class InboundEmailExtractor 
{ 
    public async static Task<InboundEmailInputModel> ExtractInboundEmail(HttpRequestBase request) 
    { 
     var serialiser = new JavaScriptSerializer(); 

     var inboundEmail = new InboundEmailInputModel(); 

     inboundEmail.Headers = request.Unvalidated.Form["headers"]; 
     inboundEmail.Text = request.Unvalidated.Form["text"]; 
     inboundEmail.Html = request.Unvalidated.Form["html"]; 
     inboundEmail.From = request.Unvalidated.Form["from"]; 
     inboundEmail.To = request.Unvalidated.Form["to"]; 
     inboundEmail.Cc = request.Unvalidated.Form["to"].Split(',').ToList(); 
     inboundEmail.Subject = request.Unvalidated.Form["subject"]; 
     inboundEmail.Dkim = request.Unvalidated.Form["dkim"]; 
     inboundEmail.Spf = request.Unvalidated.Form["spf"]; 

     var envelopeRaw = request.Unvalidated.Form["envelope"]; 
     if (envelopeRaw != null) 
     { 
      inboundEmail.Envelope = serialiser.Deserialize<InboundEmailEnvelopeInputModel>(envelopeRaw); 
     } 

     var charsetsRaw = request.Unvalidated.Form["charsets"]; 
     if (charsetsRaw != null) 
     { 
      inboundEmail.Charsets = 
       new JavaScriptSerializer().Deserialize<InboundEmailCharsetsInputModel>(charsetsRaw); 
     } 

     var spamScoreRaw = request.Unvalidated.Form["spam_score"]; 
     if (spamScoreRaw != null) 
     { 
      inboundEmail.SpamScore = float.Parse(spamScoreRaw, CultureInfo.InvariantCulture.NumberFormat); 
     } 

     inboundEmail.SpamReport = request.Unvalidated.Form["spam_report"]; 

     var attachmentsRaw = request.Unvalidated.Form["attachments"]; 
     if (attachmentsRaw != null) 
     { 
      inboundEmail.Attachments = Convert.ToInt32(attachmentsRaw); 
     } 

     var attachmentInfoRaw = request.Unvalidated.Form["attachment-info"]; 
     if (attachmentInfoRaw != null) 
     { 
      inboundEmail.AttachmentInfo = System.Web.Helpers.Json.Decode(attachmentInfoRaw); 
     } 

     inboundEmail.SenderIp = request.Unvalidated.Form["sender_ip"]; 

     inboundEmail.AttachmentFiles = request.Files; 

     return inboundEmail; 
    } 
} 

评论和改进这种方法大加赞赏。