Упражнение — пакетная загрузка сообщений электронной почты пользователя

Завершено

В этом упражнении вы расширите приложение, чтобы загружать письма пользователя блоками по 10 штук.

Загрузка писем блоками по 10 штук

Для начала мы изменим класс GraphEmailClient, чтобы он поддерживал загрузку электронных писем блоками.

  1. В редакторе кода откройте файл Graph/GraphEmailClient.cs.

  2. Найдите метод GetNextLink(). Обратите внимание, что он принимает в качестве параметра объект IUserMessagesCollectionPage с именем pagedMessages. Он использует этот параметр, чтобы проверить, существует ли значение 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.cs.

  7. Откройте Pages/Email.cshtml.cs в редакторе кода.

  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 или другой редактор кода

      Откройте окно терминала в папке Begin и запустите указанную ниже команду.

      dotnet run
      
  2. Откройте браузер и перейдите по адресу https://localhost:5001.

  3. Войдите с помощью клиента разработчика Microsoft 365, который использовался ранее при регистрации приложения Microsoft Entra.

  4. Выберите ссылку Электронная почта в верхнем колонтитуле для просмотра сообщений электронной почты пользователя.

  5. После загрузки страницы вы увидите сообщения электронной почты пользователя. Если сообщений больше 10, в нижней части страницы должна появиться кнопка Следующая страница. Нажмите эту кнопку для просмотра следующей партии сообщений электронной почты.

    Страница с сообщениями электронной почты, извлеченными из Microsoft Graph.

    Примечание.

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

  6. Прежде чем продолжать работу, закройте браузер и нажмите Ctrl+C в окне терминала, чтобы остановить сервер.

    Примечание.

    Если вы открыли проект в Visual Studio, можете закрыть браузер или нажать Shift+F5 в Visual Studio, чтобы остановить сервер. Закройте созданное окно терминала Visual Studio, если оно еще открыто.

Вы успешно проработали пример получения доступа к сообщениям электронной почты в Microsoft 365 с помощью Microsoft Graph и ASP.NET Core для пользователя, вошедшего в систему!