2015-07-04 8 views
9

Mam ten kod, który używam w mojej aplikacji:Czy mój kod ASP.Net może uzyskać potwierdzenie od sendgrid, że wysłano wiadomość e-mail?

private async Task configSendGridasync(IdentityMessage message) 
    { 
     var myMessage = new SendGridMessage(); 
     myMessage.AddTo(message.Destination); 
     myMessage.From = new System.Net.Mail.MailAddress(
          "[email protected]", "AB Registration"); 
     myMessage.Subject = message.Subject; 
     myMessage.Text = message.Body; 
     myMessage.Html = message.Body; 

     var credentials = new NetworkCredential(
        ConfigurationManager.AppSettings["mailAccount"], 
        ConfigurationManager.AppSettings["mailPassword"] 
        ); 

     // Create a Web transport for sending email. 
     var transportWeb = new Web(credentials); 

     // Send the email. 
     if (transportWeb != null) 
     { 
      await transportWeb.DeliverAsync(myMessage); 
     } 
     else 
     { 
      Trace.TraceError("Failed to create Web transport."); 
      await Task.FromResult(0); 
     } 
    } 

To się nazywa tutaj:

public async Task<IHttpActionResult> Register(RegisterBindingModel model) 
    { 

     var user = new ApplicationUser() 
     { 
      Email = model.Email, 
      FirstName = model.FirstName, 
      LastName = model.LastName, 
      RoleId = (int)ERole.Student, 
      UserName = model.UserName 
     }; 
     var result = await UserManager.CreateAsync(user, model.Password); 
     if (result.Succeeded) 
     { 
      var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); 
      var callbackUrl = model.Server + 
           "/index.html" + 
           "?load=confirmEmail" + 
           "&userId=" + user.Id + 
           "&code=" + HttpUtility.UrlEncode(code); 
      await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking this link: <a href=\"" + callbackUrl + "\">link</a>"); 
     } 
     if (!result.Succeeded) 
     { 
      return GetErrorResult(result); 
     } 
     return Ok(); 

    } 

Czy jest jakiś sposób mogę uzyskać potwierdzenie od sendgrid, że wiadomość została wysłana lub dowolny inne informacje?

Odpowiedz

11

Wiadomości e-mail wysyłane za pośrednictwem interfejsu internetowego SendGrid są asynchroniczne, więc aby uzyskać potwierdzenie, musisz zaimplementować webhook. Event Webhook zamieści wybrane zdarzenia na zdefiniowany adres URL. W tym przypadku interesuje Cię wydarzenie "dostarczone".

Potrzebujesz kodu na swoim serwerze, aby obsłużyć przychodzący webhook i wykonać dowolną logikę na podstawie wyników, takich jak rejestrowanie dostarczonych zdarzeń. Istnieje kilka bibliotek, które udostępniają społeczności, dzięki czemu możesz łatwo utworzyć program obsługi webhook. Sugeruję sendgrid-webhooks, która jest dostępna na nuget.

Następnie prześlij przychodzący test POST i przekaż go do analizatora składni, aby odzyskać obiekt.

Ponieważ używasz ASP.NET MVC, możesz użyć metody [HttpPost] wewnątrz kontrolera, aby otrzymać dane POST z SendGrid. Następnie możesz przeanalizować go za pomocą sendgrid-webhooks.

Z sendgrid-webhooks readme:

var parser = new WebhookParser(); 
var events = parser.ParseEvents(json); 

var webhookEvent = events[0]; 

//shared base properties 
webhookEvent.EventType; //Enum - type of the event as enum 
webhookEvent.Categories; //IList<string> - list of categories assigned ot the event 
webhookEvent.TimeStamp; //DateTime - datetime of the event converted from unix time 
webhookEvent.UniqueParameters; //IDictionary<string, string> - map of key-value unique parameters 

//event specific properties 
var clickEvent = webhookEvent as ClickEvent; //cast to the parent based on EventType 
clickEvent.Url; //string - url on what the user has clicked 

pracuję w SendGrid więc proszę dać mi znać, jeśli jest coś, co mogę pomóc.

+0

Dziękuję bardzo. Wspaniale mieć pomoc od kogoś, kto pracuje w SendGrid. Odczeszę chwilę, przetestuj swoje rozwiązanie i daj znać, jeśli mam jakieś pytania. –

-1

Nie sądzę, aby SendGrid został skonfigurowany w celu udzielenia odpowiedzi. Jednak, jak hack, można BCC sam (a zatem znać przynajmniej email wbiegł na boisko) dodając następujący kod do klasy configSendGridasync

. 
    . 
    . 
    //this is your old code... 
    myMessage.Text=message.Body; 
    myMessage.Html = message.Body; 

    //Add this... 
    myMessage.AddBcc("[email protected]"); 

nadzieję, że to pomaga!

5

Będziesz chciał użyć numeru Event Webhooks, aby otrzymać potwierdzenie odesłania, aby potwierdzić, że wiadomość została dostarczona do odbiorcy.

Trzeba by skonfigurować stronę, aby zaakceptować wydarzenia z Sendgrid, takie jak:

https://yourdomain.com/email/hook który przyjąłby JSON, które następnie zająć się jednak chcesz. Dokumentacja Json.NET byłaby w stanie wskazać, w jaki sposób zaakceptować JSON, a następnie przekształcić go w obiekt, którego można użyć.

Przykład JSON byłbyś Wysłany:

{ 
    "sg_message_id":"sendgrid_internal_message_id", 
    "email": "[email protected]", 
    "timestamp": 1337197600, 
    "smtp-id": "<[email protected]>", 
    "event": "delivered" 
    }, 

Zdarzenia można odbierać od SendGrid są: Przetworzone, upuszczony, dostarczone, Odroczone, Bounce, otwarte, kliknij Spam Report, subskrypcję, Grupa subskrypcję, Group Resubscribe.

Dzięki tym opcjom możesz mieć webhook do obsługi odsyłaczy, np. Poprosić kogoś o znalezienie właściwego adresu e-mail użytkownika, którego próbowałeś wysłać pocztą e-mail.

+0

Będę czekać chwilę i przejrzę wszystkie odpowiedzi, a następnie przyjmuję ten, który najlepiej tłumaczy dla wszystkich.Dziękuję bardzo za poświęcenie czasu, aby odpowiedzieć na pytanie. –

+0

Jak sparować webhook z tym, co wysłałem? Kiedy wysłałem wiadomość, nie ma "sg_messge_id" jako odpowiedzi dla mnie, aby zachować i dopasować do powrotu webhook. – chaintng

Powiązane problemy