2014-08-15 4 views
1

Я работаю над ответом от электронной почты в своем приложении, и я использую mandrillapp.com. Как это работает сейчас:Интеграция сторонних сервисов

1. User replies from their email to [email protected] 
2. Mandril receives the mail and sends the POST request to preconfigured endpoint of my service 
3. I process that post request (create internal app message) 

Что касается к шагу 3, я в основном код, который должен создать внутреннее сообщение приложения, завернутое в begin/rescue. Поэтому любые возможные ошибки будут сообщены мне, что у них было в прошлом.

Однако теперь я столкнулся с пользователем, который утверждает, что письмо было отправлено (шаг 1), я связался с поддержкой мандрилла, который, по их словам, обработал его и отправил на конечную точку (шаг 2).

Так что это оставляет меня только для того, чтобы увидеть, что произошло на шаге 3, в пределах определенного временного диапазона. Мое приложение находится на геройку, а мои журналы, хранящиеся на AWS, я мог вернуться в прошлое к этому конкретному времени, и я мог видеть успешный запрос POST с стороны mandrill.

Что я могу сделать, чтобы поймать этот случай вперед? И исправить это, конечно, потому что я понятия не имею, что происходит сейчас.

Я думал о создании модели с именем Mandrill hooks, которая имела бы столбец params, который будет сериализованным хэшем, и он сохранит все параметры, которые пришли к моей конечной точке из mandrill.

Тогда я мог проверить количество почтовых ящиков, полученных моей учетной записью, и те, которые были отправлены mandrill, и, надеюсь, я разберу 1 с другим счетом, и поскольку у меня будут данные params в моем db, я смогу воспроизвести случай.

Или есть более разумный подход, поскольку это выглядит наивным даже для меня?

ответ

1

Я думаю, что может быть более разумный подход, который позволит вам иметь больше контроля над всем, и это звучит очень похоже на то, что я недавно сделал, и I answered a similar question here. Помогает ли это вообще или есть какая-то конкретная помощь, которую вы хотели бы?

** Edit: Linked пост/код ниже

Я бегу мой Mandrill Webhook обработки как проект API в VS и это, как я получил его и работает:

[HttpPost] 
    public string Post() 
    { 
     /* Every Mandrill webhook uses the same general data format, regardless of the event type. 
     * The webhook request is a standard POST request with a single parameter (currently) - 'mandrill_events'. */ 

     string validJson = HttpContext.Current.Request.Form["mandrill_events"].Replace("mandrill_events=", ""); //"mandrill_events=" is not valid JSON. If you take that out you should be able to parse it. //http://stackoverflow.com/questions/24521326/deserializing-mandrillapp-webhook-response 
     List<MandrillEvent> mandrillEventList = JsonConvert.DeserializeObject<List<MandrillEvent>>(validJson); 

     foreach (MandrillEvent mandrillEvent in mandrillEventList) 
     { 
      if (mandrillEvent.msg.email != null) 
      { 
       DataLayer.ReportingData.EmailSave(mandrillEvent); //Saves MandrillEvent email to database and sets a messageId for datalayer 
      } 
     } 

     foreach (MandrillEvent mandrillEvent in mandrillEventList) 
     { 
      DataLayer.ReportingData.MandrillEventSave(mandrillEvent); //Saves MandrillEvent object to database 
     } 

     return "DONE"; 
    } 

Затем я взял задокументированные (и недокументированные) параметры JSON «mandrill_event» и использовал json2csharp.com для генерации свойств C#. Я создал класс под названием «MandrillEvent.cs» и поместить их в:

public class SmtpEvent 
    { 
     public int ts { get; set; } 
     public DateTime SmtpTs { get; set; } 
     public string type { get; set; } 
     public string diag { get; set; } 
     public string source_ip { get; set; } 
     public string destination_ip { get; set; } 
     public int size { get; set; } 
     public int smtpId { get; set; } //added for datalayer 
    } 

    public class Msg 
    { 
     public int ts { get; set; } 
     public DateTime MsgTs { get; set; } 
     public string _id { get; set; } 
     public string state { get; set; } 
     public string subject { get; set; } 
     public string email { get; set; } 
     public List<object> tags { get; set; } 
     public List<object> opens { get; set; } //an array of containing an item for each time the message was opened. Each open includes the following keys: "ts", "ip", "location", "ua" 
     public List<object> clicks { get; set; } //an array containing an item for each click recorded for the message. Each item contains the following: "ts", "url" 
     public List<SmtpEvent> smtp_events { get; set; } 
     public List<object> resends { get; set; } //not currently documented on http://help.mandrill.com/entries/58303976-Message-Event-Webhook-format 
     public string _version { get; set; } 
     public string diag { get; set; } //for bounced and soft-bounced messages, provides the specific SMTP response code and bounce description, if any, received from the remote server 
     public int bgtools_code { get; set; } //Is it this? for bounced and soft-bounced messages, a short description of the bounce reason such as bad_mailbox or invalid_domain. (not currently documented but in JSON response) 
     public string sender { get; set; } 
     public object template { get; set; } 
     public string bounce_description { get; set; } 

     public Msg() 
     { 
      tags = new List<object>(); 
      opens = new List<object>(); 
      clicks = new List<object>(); 
      smtp_events = new List<SmtpEvent>(); 
      smtp_events.Add(new SmtpEvent()); 
      resends = new List<object>(); 
     } 
    } 

    public class MandrillEvent 
    { 
     public string @event { get; set; } 
     public string _id { get; set; } 
     public Msg msg { get; set; } 
     public int ts { get; set; } 
     public DateTime MandrillEventTs { get; set; } 
     public int messageId { get; set; } //added for datalayer 
     public List<string> SingleMandrillEventData { get; set; } //added for Reporting 

     public MandrillEvent() 
     { 
      SingleMandrillEventData = new List<string>(); 
      msg = new Msg(); 
     } 
    } 

Теперь у вас есть «mandrill_events» объект JSON в качестве функционирующих C# объекта !! Помогло ли вам это или вам нужно еще разъяснение/помощь?

+0

Привет, Хоппер, на данный момент этот ответ является нетерпеливым видом как «ссылка-только-ответ», вы можете подумать о том, чтобы он мог стоять в одиночестве, сохраняя ссылку в дополнении. – bummi

+0

О, спасибо, бамми! Отредактировано для добавления связанного ответа :) – Hopper

Смежные вопросы