Добавление возможностей электронной почты в приложения PHP с помощью Microsoft Graph

В этой статье описано, как расширить приложение, созданное в разделе Создание приложений PHP с помощью Microsoft Graph , с помощью API почты Microsoft Graph. Вы используете Microsoft Graph для вывода списка папки "Входящие" пользователя и отправки сообщения электронной почты.

Перечисление папки "Входящие" пользователя

Начните с перечисления сообщений в почтовом ящике пользователя.

  1. Добавьте приведенный ниже код в класс GraphHelper.

    public static function getInbox(): Models\MessageCollectionResponse {
        $configuration = new MessagesRequestBuilderGetRequestConfiguration();
        $configuration->queryParameters = new MessagesRequestBuilderGetQueryParameters();
        // Only request specific properties
        $configuration->queryParameters->select = ['from','isRead','receivedDateTime','subject'];
        // Sort by received time, newest first
        $configuration->queryParameters->orderby = ['receivedDateTime DESC'];
        // Get at most 25 results
        $configuration->queryParameters->top = 25;
        return GraphHelper::$userClient->me()
            ->mailFolders()
            ->byMailFolderId('inbox')
            ->messages()
            ->get($configuration)->wait();
    }
    
  2. Замените пустую listInbox функцию в main.php следующим кодом.

    function listInbox(): void {
        try {
            $messages = GraphHelper::getInbox();
    
            // Output each message's details
            foreach ($messages->getValue() as $message) {
                print('Message: '.$message->getSubject().PHP_EOL);
                print('  From: '.$message->getFrom()->getEmailAddress()->getName().PHP_EOL);
                $status = $message->getIsRead() ? "Read" : "Unread";
                print('  Status: '.$status.PHP_EOL);
                print('  Received: '.$message->getReceivedDateTime()->format(\DateTimeInterface::RFC2822).PHP_EOL);
            }
    
            $nextLink = $messages->getOdataNextLink();
            $moreAvailable = isset($nextLink) && $nextLink != '' ? 'True' : 'False';
            print(PHP_EOL.'More messages available? '.$moreAvailable.PHP_EOL.PHP_EOL);
        } catch (Exception $e) {
            print('Error getting user\'s inbox: '.$e->getMessage().PHP_EOL.PHP_EOL);
        }
    }
    
  3. Запустите приложение, войдите в систему и выберите вариант 2, чтобы получить список папки "Входящие".

    Please choose one of the following options:
    0. Exit
    1. Display access token
    2. List my inbox
    3. Send mail
    4. Make a Graph call
    2
    Message: Updates from Ask HR and other communities
      From: Contoso Demo on Yammer
      Status: Read
      Received: Mon, 18 Apr 2022 14:24:16 +0000
    Message: Employee Initiative Thoughts
      From: Patti Fernandez
      Status: Read
      Received: Mon, 18 Apr 2022 13:52:03 +0000
    Message: Voice Mail (11 seconds)
      From: Alex Wilber
      Status: Unread
      Received: Wed, 13 Apr 2022 02:30:27 +0000
    Message: Our Spring Blog Update
      From: Alex Wilber
      Status: Unread
      Received: Tue, 12 Apr 2022 16:46:01 +0000
    Message: Atlanta Flight Reservation
      From: Alex Wilber
      Status: Unread
      Received: Mon, 11 Apr 2022 13:39:10 +0000
    Message: Atlanta Trip Itinerary - down time
      From: Alex Wilber
      Status: Unread
      Received: Fri, 08 Apr 2022 18:36:01 +0000
    
    ...
    
    More messages available? True
    

Описание getInbox

Рассмотрим код в getInbox функции.

Доступ к известным почтовым папкам

Функция передается /me/mailFolders/inbox/messages в построитель запросов, который создает запрос к API списка сообщений . Так как он включает сегмент /mailFolders/inbox , API возвращает только сообщения в запрошенной папке почты. В этом случае, так как папка "Входящие" является хорошо известной папкой по умолчанию в почтовом ящике пользователя, она доступна по известному имени. Доступ к папкам без изменений можно получить таким же образом, заменив известное имя свойством идентификатора почтовой папки. Дополнительные сведения о доступных известных именах папок см. в разделе Тип ресурса mailFolder.

Доступ к коллекции

getUser В отличие от функции из предыдущего раздела, которая возвращает один объект, этот метод возвращает коллекцию сообщений. Большинство API в Microsoft Graph, возвращающих коллекцию, не возвращают все доступные результаты в одном ответе. Вместо этого они используют разбиение на страницы для возврата части результатов, предоставляя метод для клиентов, чтобы запросить следующую страницу.

Размеры страниц по умолчанию

API, использующие разбиение на страницы, реализуют размер страницы по умолчанию. Для сообщений значение по умолчанию — 10. Клиенты могут запрашивать больше (или меньше) с помощью параметра запроса $top . В getInboxдобавление $top выполняется со свойством queryParameters->top в параметрах запроса.

Примечание.

Переданное значение queryParameters->top является верхней границей, а не явным числом. API возвращает количество сообщений до указанного значения.

Получение последующих страниц

Если на сервере доступно больше результатов, ответы коллекции содержат @odata.nextLink свойство с URL-адресом API для доступа к следующей странице. Пакет SDK для PHP предоставляет getOdataNextLink метод для объектов запросов на коллекцию. Если этот метод возвращает непустую строку, доступны дополнительные результаты. Дополнительные сведения см. в разделе Страница через коллекцию с помощью пакетов SDK Microsoft Graph.

Сортировка коллекций

Функция использует параметр запроса $orderby для запроса результатов, отсортированных по времени получения сообщения (receivedDateTime свойство). Он включает в себя DESC ключевое слово, чтобы сообщения, полученные в последнее время, были перечислены первыми.

Отправка почты

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

  1. Добавьте приведенный ниже код в класс GraphHelper.

    public static function sendMail(string $subject, string $body, string $recipient): void {
        $message = new Models\Message();
        $message->setSubject($subject);
    
        $itemBody = new Models\ItemBody();
        $itemBody->setContent($body);
        $itemBody->setContentType(new Models\BodyType(Models\BodyType::TEXT));
        $message->setBody($itemBody);
    
        $email = new Models\EmailAddress();
        $email->setAddress($recipient);
        $to = new Models\Recipient();
        $to->setEmailAddress($email);
        $message->setToRecipients([$to]);
    
        $sendMailBody = new SendMailPostRequestBody();
        $sendMailBody->setMessage($message);
    
        GraphHelper::$userClient->me()->sendMail()->post($sendMailBody)->wait();
    }
    
  2. Замените пустую sendMail функцию в main.php следующим кодом.

    function sendMail(): void {
        try {
            // Send mail to the signed-in user
            // Get the user for their email address
            $user = GraphHelper::getUser();
    
            // For Work/school accounts, email is in Mail property
            // Personal accounts, email is in UserPrincipalName
            $email = $user->getMail();
            if (empty($email)) {
                $email = $user->getUserPrincipalName();
            }
    
            GraphHelper::sendMail('Testing Microsoft Graph', 'Hello world!', $email);
    
            print(PHP_EOL.'Mail sent.'.PHP_EOL.PHP_EOL);
        } catch (Exception $e) {
            print('Error sending mail: '.$e->getMessage().PHP_EOL.PHP_EOL);
        }
    }
    
  3. Запустите приложение, войдите в систему и выберите вариант 3, чтобы отправить себе сообщение электронной почты.

    Please choose one of the following options:
    0. Exit
    1. Display access token
    2. List my inbox
    3. Send mail
    4. Make a Graph call
    3
    
    Mail sent.
    

    Примечание.

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

  4. Чтобы убедиться, что сообщение получено, выберите вариант 2, чтобы получить список папки "Входящие".

Объяснение sendMail

Рассмотрим код в sendMail функции.

Отправка почты

Функция использует построитель $userClient->me()->sendMail() запросов, который создает запрос к API отправки почты . Построитель запросов принимает текст запроса, содержащий сообщение для отправки.

Создание объектов

В отличие от предыдущих вызовов Microsoft Graph, которые считывают только данные, этот вызов создает данные. Чтобы создать элементы с помощью клиентской библиотеки, необходимо создать ассоциативный массив, представляющий данные, задать нужные свойства, а затем отправить их в вызове API. Так как вызов отправляет данные, POST вместо используется GETметод .

Следующее действие