2015-07-04 19 views
9

tôi có mã này mà tôi đang sử dụng trong ứng dụng của tôi:Mã ASP.Net của tôi có thể được xác nhận từ sendgrid rằng một email đã được gửi không?

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

Nó được gọi là ở đây:

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(); 

    } 

Có cách nào tôi có thể nhận được xác nhận từ sendgrid rằng thông điệp đã được gửi đi hoặc bất kỳ thông tin khác?

Trả lời

11

Email được gửi qua API web SendGrid không đồng bộ, do đó, để nhận được xác nhận, bạn cần triển khai webhook. Event Webhook sẽ đăng sự kiện bạn chọn vào URL mà bạn xác định. Trong trường hợp này, bạn quan tâm đến sự kiện "được phân phối".

Bạn sẽ cần một số mã trên máy chủ của mình để xử lý webhook đến và thực hiện bất kỳ logic nào dựa trên kết quả, chẳng hạn như ghi nhật ký sự kiện được phân phối. Có một vài thư viện đóng góp của cộng đồng ngoài đó cho phép bạn dễ dàng tạo trình xử lý webhook. Tôi đề nghị sendgrid-webhooks, có sẵn trên nuget.

Sau đó, chuyển POST đến và đưa nó đến trình phân tích cú pháp để lấy lại đối tượng.

Vì bạn đang sử dụng ASP.NET MVC, bạn có thể sử dụng phương thức [HttpPost] bên trong bộ điều khiển để nhận dữ liệu POST từ SendGrid. Sau đó, bạn có thể phân tích cú pháp bằng cách sử dụng sendgrid-webhooks.

Từ 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 

Tôi làm việc tại SendGrid vì vậy hãy cho tôi biết nếu có bất cứ điều gì tôi có thể giúp với.

+0

Cảm ơn rất nhiều. Thật tuyệt khi được giúp đỡ từ một người làm việc tại SendGrid. Tôi sẽ đợi một lúc, kiểm tra giải pháp của bạn và cho bạn biết nếu tôi có bất kỳ câu hỏi nào. –

-1

Tôi không nghĩ SendGrid được thiết lập để đưa ra phản hồi. Tuy nhiên, như một hack, bạn có thể BCC mình (và do đó biết ít nhất email đã đi ra) bằng cách thêm đoạn mã sau vào lớp configSendGridasync bạn

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

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

Hope this helps!

5

Bạn sẽ muốn sử dụng Event Webhooks để nhận được xác nhận được gửi lại cho bạn để xác nhận thư đã được gửi tới người nhận.

Bạn sẽ cần phải thiết lập một trang để chấp nhận sự kiện từ Sendgrid, chẳng hạn như:

https://yourdomain.com/email/hook mà sẽ chấp nhận JSON mà sau đó bạn sẽ đối phó với tuy nhiên bạn muốn. Tài liệu Json.NET sẽ có thể hướng dẫn bạn cách chấp nhận JSON và sau đó biến nó thành một đối tượng bạn có thể sử dụng.

Ví dụ JSON bạn muốn được niêm yết:

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

Các sự kiện mà bạn có thể nhận được từ SendGrid là: chế biến, Dropped, Delivered, hoãn lại, Bounce, Open, Click, Spam Report, Hủy đăng ký, Tập đoàn Hủy đăng ký, Group Resubscribe.

Với tất cả các tùy chọn này, bạn có thể có một webhook để đối phó với Bounces chẳng hạn như nhờ ai đó tìm ra địa chỉ email chính xác cho người dùng mà bạn đã cố gắng gửi email.

+0

Tôi sẽ đợi một lúc và xem lại tất cả các câu trả lời và chấp nhận câu trả lời phù hợp nhất cho mọi người.Cảm ơn bạn rất nhiều vì đã dành thời gian trả lời câu hỏi. –

+0

Làm cách nào để ghép nối webhook với những gì tôi đã gửi? Khi tôi gửi thư, không có 'sg_messge_id' làm câu trả lời cho tôi để giữ và khớp với trả lại webhook. – chaintng

Các vấn đề liên quan