任何使用Sendgrid's解析API的人都可以使用c# ASP.净MVC

本文关键字:可以使 ASP MVC API Sendgrid 解析 任何使 | 更新日期: 2023-09-27 17:52:48

我将在我的MVC应用程序中构建一个解析控制器,想知道是否有人已经这样做了。

http://sendgrid.com/docs/API_Reference/Webhooks/parse.html

任何使用Sendgrid's解析API的人都可以使用c# ASP.净MVC

如果有人试图在ASP中这样做。. NET MVC,这是我的代码片段来解析Sendgrid API Webhook调用。

    [HttpPost]
    [Transaction]
    [ValidateInput(false)]
    public ActionResult SendGrid(int attachments, string charsets, string from, string headers, string html, string subject, string envelope, string text, string to, string cc) {
        try {
            StringBuilder logText = new StringBuilder();
            logText.AppendLine("From: " + from);
            logText.AppendLine("Headers: " + headers);
            logText.AppendLine("Text: " + text);
            logText.AppendLine("Html: " + html);
            logText.AppendLine("To: " + to);
            logText.AppendLine("Cc: " + cc);
            logText.AppendLine("Subject: " + subject);
            logText.AppendLine("Attachments: " + attachments);
            //Envelope Json
            Envelope envelopeObject = null;
            if (!string.IsNullOrEmpty(envelope)) {
                envelopeObject = JsonConvert.DeserializeObject<Envelope>(envelope);
                if (envelopeObject != null) {
                    logText.AppendLine("Envelope: [from]: " + envelopeObject.From);
                    if (envelopeObject.To != null && envelopeObject.To.Length > 0)
                        foreach (var envelopeTo in envelopeObject.To)
                            logText.AppendLine("Envelope: [To]: " + envelopeTo);
                }
            }
            //Charsets Json
            CharsetRequest charsetsObject = null;
            if (!string.IsNullOrEmpty(charsets)) {
                charsetsObject = JsonConvert.DeserializeObject<CharsetRequest>(charsets);
                if (charsetsObject != null) {
                    logText.AppendLine("Charsets: [To]: " + charsetsObject.To);
                    logText.AppendLine("Charsets: [From]: " + charsetsObject.From);
                    logText.AppendLine("Charsets: [Text]: " + charsetsObject.Text);
                    logText.AppendLine("Charsets: [Subject]: " + charsetsObject.Subject);
                    logText.AppendLine("Charsets: [Html]: " + charsetsObject.Html);
                }
            }
            List<EmailAttachment> emailAttachments = new List<EmailAttachment>();
            if (attachments > 0) {
                for (int i = 0; i < attachments; i++) {
                    HttpPostedFileBase file = Request.Files[i];
                    if (file.ContentLength > 0) {
                        var attachement = new EmailAttachment();
                        attachement.ContentLength = file.ContentLength;
                        attachement.ContentType = file.ContentType;
                        attachement.Filename = file.FileName;
                        attachement.CreateBy = 1;
                        attachement.CreateDate = DateTime.Now.ToUniversalTime();
                        logText.AppendLine("File: [FileName]: " + file.FileName);
                        logText.AppendLine("File: [ContentType]: " + file.ContentType);
                        logText.AppendLine("File: [FileSize]: " + file.ContentLength);
                        byte[] fileImage = new byte[attachement.ContentLength];
                        file.InputStream.Read(fileImage, 0, attachement.ContentLength);
                        attachement.FileContent = fileImage;
                        emailAttachments.Add(attachement);
                    }
                }
            }
            List<MailAddress> toEmailAddress = new List<MailAddress>();
            MailAddress dropboxEmail = null;
            //Parsing Headers
            Regex toline = new Regex(@"(?im-:^To's*:'s*(?<to>.*)$)");
            Regex ccline = new Regex(@"(?im-:^Cc's*:'s*(?<to>.*)$)");
            MailAddress senderEmail = new MailAddress(from);
            if (!string.IsNullOrEmpty(to))
                toEmailAddress.Add(new MailAddress(to));
            if (!string.IsNullOrEmpty(cc))
                toEmailAddress.Add(new MailAddress(cc));
            //Envelope Json
            if (!string.IsNullOrEmpty(envelope)) {
                envelopeObject = JsonConvert.DeserializeObject<Envelope>(envelope);
                if (envelopeObject != null) {
                    if (envelopeObject.To != null && envelopeObject.To.Length > 0)
                        foreach (var envelopeTo in envelopeObject.To) {
                            MailAddress mailTmp = new MailAddress(envelopeTo.Trim().ToLower());
                            if (mailTmp.User.Trim().StartsWith("dropbox", StringComparison.InvariantCultureIgnoreCase))
                                dropboxEmail = mailTmp;
                            else
                                toEmailAddress.Add(mailTmp);
                        }
                }
            }
            foreach (var email in ParseMIMEEmailAddresses(toline.Match(headers).Groups["to"].Value)) {
                MailAddress mailTmp = new MailAddress(email.Trim().ToLower());
                if (mailTmp.User.Trim().StartsWith("dropbox", StringComparison.InvariantCultureIgnoreCase))
                    dropboxEmail = mailTmp;
                else
                    toEmailAddress.Add(mailTmp);
            }
            foreach (var email in ParseMIMEEmailAddresses(ccline.Match(headers).Groups["to"].Value)) {
                MailAddress mailTmp = new MailAddress(email.Trim().ToLower());
                if (mailTmp.User.Trim().StartsWith("dropbox", StringComparison.InvariantCultureIgnoreCase))
                    dropboxEmail = mailTmp;
                else
                    toEmailAddress.Add(mailTmp);
            }
            foreach (var message in toEmailAddress)
                logText.AppendLine("HEADER PARSE [To]: " + message.Address);
            if (dropboxEmail != null)
                logText.AppendLine("Dropbox Email: " + dropboxEmail.Address);
            var dropLog = new DropboxLog {
                CreateDate = DateTime.Now.ToUniversalTime(),
                Log = logText.ToString()
            };
            _dropboxLogRepository.SaveOrUpdate(dropLog);
            _dropboxLogRepository.DbContext.CommitChanges();
            if (dropboxEmail == null)
                return new HttpStatusCodeResult(500);
            if (toEmailAddress.Count == 0)
                return new HttpStatusCodeResult(500);
            //Validate the the email came from a valid user/dropbox key.
            //TODO Also validate alias here
            var dropBoxKey = dropboxEmail.User.Split('+')[1];
            if (string.IsNullOrEmpty(dropBoxKey))
                return new HttpStatusCodeResult(500);
            var user = _userService.GetUserByEmailDropBoxId(senderEmail.Address, dropBoxKey);
            if (user == null)
                return new HttpStatusCodeResult(500);
            //Create email object
            var emailToAdd = new Email {
                CreateBy = user.Id,
                CreateDate = DateTime.Now.ToUniversalTime(),
                BodyText = text,
                BodyHtml = html,
                Subject = subject,
                Sender = user,
                EmailDate = DateTime.Now.ToUniversalTime(),
                Client = user.Client
            };
            foreach (var file in emailAttachments) {
                file.CreateBy = user.Id;
                emailToAdd.AddAttachment(file);
            }
            //Get all leads by email address list
            List<string> toEmails = toEmailAddress.Select(s => s.Address).ToList();
            foreach (Lead lead in _leadService.GetLeadsByEmails(user.Client.Id, user.Id, toEmails))
                lead.AddEmail(emailToAdd);
            foreach (Contact contact in _contactService.GetContactsByEmails(user.Client.Id, user.Id, toEmails))
                contact.AddEmail(emailToAdd);
            return new HttpStatusCodeResult(200);
        }
        catch (Exception ex) {
            var dropLog = new DropboxLog {
                CreateDate = DateTime.Now.ToUniversalTime(),
                Log = ex.Message
            };
            _dropboxLogRepository.SaveOrUpdate(dropLog);
            _dropboxLogRepository.DbContext.CommitChanges();
            throw;
        }
    }
    private static IEnumerable<string> ParseMIMEEmailAddresses(string lineToParse) {
        List<string> emails = new List<string>();
        int from = 0;
        int position = 0;
        string emailText;
        while (from < lineToParse.Length) {
            int found = (found = lineToParse.IndexOf(',', from)) > 0 ? found : lineToParse.Length;
            from = found + 1;
            emailText = lineToParse.Substring(position, found - position);
            try {
                MailAddress addy = new MailAddress(emailText.Trim());
                emails.Add(addy.Address);
                position = found + 1;
            }
            catch (FormatException) {
                //Log parsing error to database for future consideration.
            }
        }
        return emails;
    }
public class SendGridRequest
{
    public string Envelope { get; set; }
    public string Charsets { get; set; }
    public string SPF { get; set; }
    public int Attachments { get; set; }
    public string DKIM { get; set; }
    public string Headers { get; set; }
    public string From { get; set; }
    public string Html { get; set; }
    public string Subject { get; set; }
    public string Text { get; set; }
    public string To { get; set; }
    public string CC { get; set; }
}
public class Envelope
{
    public string From { get; set; }
    public string[] To { get; set; }
}
public class CharsetRequest
{
    public string From { get; set; }
    public string Html { get; set; }
    public string Subject { get; set; }
    public string Text { get; set; }
    public string To { get; set; }
    public string Cc { get; set; }
}

我认为您可以使用RAZOR解析器的例子,通过模板进行一些修改来解析数据。

是的,我将它用于www.totxt.com和另一个站点,sendgrid是一个很好的解决方案,比POP3轮询好得多,并且通常从您发送到发布到您的站点的时间几乎是即时的。亚历克斯~