开发者

Anyone using Sendgrid's parse API with c# ASP.NET MVC [closed]

开发者 https://www.devze.com 2023-02-28 09:56 出处:网络
Closed. This question needs to be more focused. It is not currently accepting answers. 开发者_Python百科
Closed. This question needs to be more focused. It is not currently accepting answers. 开发者_Python百科

Want to improve this question? Update the question so it focuses on one problem only by editing this post.

Closed 7 years ago.

Improve this question

I'm going to be building out a parsing controller in my MVC application and wondering if anyone has already done this.

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


In case anyone is trying to do this in ASP.NET MVC, here is my code snipped to parse Sendgrid API Webhook call.

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


I think you can use RAZOR parser example to parse the data through templates with some modification.


Yes, I use it for www.totxt.com and one other site, sendgrid is great solution, much better than POP3 polling, and generally almost instant from the time you send until it is posted to your site. ~alex

0

精彩评论

暂无评论...
验证码 换一张
取 消