練習 - 批次載入使用者的電子郵件

已完成

在這個練習中,您將延伸應用程式,讓您以 10 個為一組分批載入使用者的電子郵件。

以 10 個為一組分批載入電子郵件

首先,修改 GraphEmailClient 類別以支援載入批次電子郵件。

  1. 在程式碼編輯器中,開啟 Graph/GraphEmailClient.cs 檔案。

  2. 請花一點時間找出 GetNextLink() 方法。 請注意,它接受名為 pagedMessagesIUserMessagesCollectionPage 物件做為參數。 它會使用此參數來檢查下一頁要求的 URL 值是否存在。

  3. 找出 GetUserMessagesPage() 方法,並注意到它接受名為 nextPageLink 的參數,代表下一批要檢索之電子郵件的 URL。 此方法也接受名為 top 的參數。 GetUserMessagesPage() 會返回元物件,其中包含已檢索的郵件和下一批電子郵件的 URL。

    public async Task<(IEnumerable<Message> Messages,
      string NextLink)> GetUserMessagesPage(
        string nextPageLink = null, int top = 10)
    {
    
    }
    
  4. GetUserMessagesPage() 方法中的現存代碼以下列代碼取代:

    IUserMessagesCollectionPage pagedMessages;
    
    try
    {
    }
    catch (Exception ex)
    {
      _logger.LogError($"Error calling Graph /me/messages to page messages: {ex.Message}");
      throw;
    }
    
    return (Messages: pagedMessages,
            NextLink: GetNextLink(pagedMessages));
    
  5. try 區塊中插入下列程式碼。

    if (nextPageLink == null)
    {
      // Get initial page of messages
      pagedMessages = await _graphServiceClient.Me.Messages
              .Request()
              .Select(msg => new
              {
                  msg.Subject,
                  msg.BodyPreview,
                  msg.ReceivedDateTime
              })
              .Top(top)
              .OrderBy("receivedDateTime desc")
              .GetAsync();
    }
    else
    {
      // Use the next page request URI value to get the page of messages
      var messagesCollectionRequest = new UserMessagesCollectionRequest(nextPageLink, _graphServiceClient, null);
      pagedMessages = await messagesCollectionRequest.GetAsync();
    }
    

    此代碼會執行下列檢查:

    • 如果沒有 nextPageLink 值,則插入的 _graphServiceClient 實例會用來檢索郵件的初始批次。
    • 如果 nextPageLink 值確實存在,則代碼會透過傳遞 nextPageLink_graphServiceClient 到新 UserMessagesCollectionRequest 實例,以檢索下一個電子郵件批次。
  6. 在繼續之前,請先儲存 GraphEmailClient

  7. 在您的代碼編輯器中開啟 Pages/Email. cshtml

  8. 以下列項目取代 OnGetAsync() 方法中的代碼,以使用您先前修改的 GetUserMessagesPage() 方法:

    var messagesPagingData = await _graphEmailClient.GetUserMessagesPage(NextLink);
    Messages = messagesPagingData.Messages;
    NextLink = messagesPagingData.NextLink;
    await Task.CompletedTask;
    
  9. 在繼續之前,請先儲存 Email.cshtml.cs

  10. 在代碼編輯器中開啟 Pages/Email.cshtml ,並找到下列代碼。 此代碼區塊會將 NextLink 內容值儲存到頁面。 使用者選取 [下一頁] 按鈕時,連結值會傳遞至伺服器,並用來檢索下一批電子郵件。

    @if (!String.IsNullOrEmpty(Model.NextLink)) {
        <a asp-page="/Email" asp-route-nextlink="@Model.NextLink"
          class="btn btn-primary">Next Page</a>
    }
    

執行您的應用程式

執行應用程式之前,請確認用來登錄的帳戶內具有電子郵件。

  1. 根據您的代碼編輯器執行下列步驟:

    • Visual Studio

      F5 以組建及執行專案。

    • Visual Studio Code 或另一個程式碼編輯器

      在 [ 開始 ] 資料夾中開啟終端視窗, 並執行下列命令:

      dotnet run
      
  2. 開啟瀏覽器並前往 https://localhost:5001

  3. 使用您在註冊 Azure Active Directory 應用程式時所用的 Microsoft 365 開發人員租用戶登入。

  4. 選取標頭中的 [電子郵件] 連結,以查看使用者的電子郵件訊息。

  5. 當頁面載入時,會顯示使用者的電子郵件訊息。 如果有超過 10 則訊息,您應該會看到頁面底部的 [下一頁] 按鈕。 選取按鈕以查看下一批電子郵件訊息。

    顯示從 Microsoft Graph 中檢索的電子郵件訊息的頁面。

    注意事項

    如果您未看到任何電子郵件訊息, 請確定您用來登入應用程式的帳戶收件匣中有電子郵件。

  6. 關閉瀏覽器, 然後在終端機視窗中按 Ctrl+C 以停止伺服器之後再繼續。

    注意事項

    如果您已在 Visual Studio 中開啟專案, 可以關閉瀏覽器或選取 Visual Studio 中的 Shift + F5, 以停止伺服器。 關閉 Visual Studio 建立的終端視窗 (如果它仍為開啟)。

您已成功示範如何使用 Microsoft Graph 和 ASP.NET Core 存取及顯示登入使用者的 Microsoft 365 電子郵件!