如何使用MVC模型绑定从Asp.net MVC中的SendGrid入站解析Webhook中获取数据? [英] How do I use MVC model binding to get data from SendGrid Inbound Parse Webhook in Asp.net MVC?

查看:83
本文介绍了如何使用MVC模型绑定从Asp.net MVC中的SendGrid入站解析Webhook中获取数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在考虑实现SendMail入站解析Webhook,但发现它们提供的示例似乎离完美的解决方案还有很长的路要走.

I am looking at implementing the SendMail Inbound Parse Webhook but have found that the examples they provide seem to fall a long way short of a perfect solution.

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

这并没有以任何我认为不对的方式使用模型绑定.另外,他们的代码不会从表单数据中提取附件.

This doesn't use model binding in any way which seems wrong to me. Also their code does not extract the attachments from the form data.

非常感谢所有建议,示例和帮助.

All advice, examples and help much appreciated.

推荐答案

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

This is my current best solution for extracting the email data from the SendGrid Inbound Parse Webhook in .net.

请注意,它使用普通的MVC控制器而不是WebApi控制器,因为文件似乎未附加到WebApi控制器中的请求.

Notice that it uses a normal MVC controller and not an WebApi Controller as the files do not seem to be attached to the Request in a WebApi controller.

型号:

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

有关此方面的评论和改进方法.

Comments and ways of improving this much appreciated.

这篇关于如何使用MVC模型绑定从Asp.net MVC中的SendGrid入站解析Webhook中获取数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆