2015-07-04 37 views
9

我有這樣的代碼,我用我的應用程序:我的ASP.Net代碼能否通過sendgrid發送電子郵件確認?

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

它在這裏被稱爲:

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

    } 

有沒有什麼方法可以讓我從sendgrid得到確認的消息已發送或任何其他信息?

回答

11

通過SendGrid Web API發送的電子郵件是異步的,所以要獲得確認,您需要實現webhook。 Event Webhook會將您選擇的事件發佈到您定義的網址。在這種情況下,您對「交付」事件感興趣。

在服務器上需要一些代碼來處理傳入的webhook並根據結果執行任何邏輯,例如記錄傳遞的事件。有一些社區貢獻的圖書館,讓你輕鬆創建一個webhook處理程序。我建議sendgrid-webhooks,它可以在nuget上找到。

然後,將傳入的POST傳遞給解析器以獲取對象。

由於您使用的是ASP.NET MVC,因此您可以使用控制器內的[HttpPost]方法從SendGrid接收POST數據。然後你可以使用sendgrid-webhooks解析它。

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 

我在SendGrid工作,所以請讓我知道如果有什麼我可以幫忙。

+0

非常感謝。非常感謝在SendGrid工作的人的幫助。我會等一會,測試你的解決方案,並讓我知道如果我有任何問題。 –

-1

我不認爲SendGrid被設置爲給予迴應。但是,作爲一個黑客,你可以自己BCC通過添加以下代碼到你的configSendGridasync類

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

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

希望這有助於(因此至少知道電子郵件已經出去了)!

5

您將需要使用Event Webhooks來獲取確認發回給您,以確認郵件已發送給收件人。

您將需要設置一個網頁,以接受來自Sendgrid的事件,如:

https://yourdomain.com/email/hook這將接受JSON,你會再與不過你想要的處理。 Json.NET文檔將能夠指導您如何接受JSON,然後將其轉換爲可以使用的對象。

例JSON你會發布時間:

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

您可以接收來自SendGrid是事件:加工,掉線,交付,延期,退回,打開,點擊,垃圾郵件報告,退訂,退訂,組重新訂閱。

通過所有這些選項,您可以使用webhook來處理退信,例如讓某人找到您嘗試發送電子郵件的用戶的正確電子郵件地址。

+0

我會等一會兒,查看所有答案,並接受最適合每個人的解釋。非常感謝您花時間回答這個問題。 –

+0

我如何將webhook與我發送的內容配對? 當我確實發送郵件時,沒有'sg_messge_id'作爲響應讓我保持和webhook返回匹配。 – chaintng