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 questionI'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
精彩评论