Создание PHP приложений с помощью Microsoft Graph
В этом руководстве описано, как создать консольное приложение PHP, использующее API Microsoft Graph для доступа к данным от имени пользователя.
Примечание.
Сведения о том, как использовать Microsoft Graph для доступа к данным с помощью проверки подлинности только для приложений, см. в этом руководстве по проверке подлинности только для приложений.
В этом руководстве описан порядок выполнения перечисленных ниже задач.
- Получение вошедшего пользователя
- Вывод списка сообщений пользователя в папке "Входящие"
- Отправить сообщение
Совет
В качестве альтернативы этому руководству вы можете скачать готовый код с помощью средства быстрого запуска , которое автоматизирует регистрацию и настройку приложений. Скачанный код работает без каких-либо изменений.
Вы также можете скачать или клонировать репозиторий GitHub и следовать инструкциям в файле README, чтобы зарегистрировать приложение и настроить проект.
Предварительные условия
Перед началом работы с этим руководством на компьютере разработки должны быть установлены PHP и Composer .
У вас также должна быть рабочая или учебная учетная запись Майкрософт с почтовым ящиком Exchange Online. Если у вас нет клиента Microsoft 365, вы можете претендовать на него в рамках Программы разработчиков Microsoft 365. Дополнительные сведения см. в разделе Вопросы и ответы. Кроме того, вы можете зарегистрироваться для получения бесплатной пробной версии на 1 месяц или приобрести план Microsoft 365.
Примечание.
Это руководство было написано с PHP версии 8.1.5 и Composer версии 2.3.5. Действия, описанные в этом руководстве, могут работать с другими версиями, но не были протестированы.
Регистрация приложения на портале
В этом упражнении вы зарегистрируете новое приложение в Azure Active Directory, чтобы включить проверку подлинности пользователей. Вы можете зарегистрировать приложение в Центре администрирования Microsoft Entra или с помощью пакета SDK Для Microsoft Graph PowerShell.
Регистрация приложения для проверки подлинности пользователей
В этом разделе описано, как зарегистрировать приложение, которое поддерживает проверку подлинности пользователей с помощью потока кода устройства.
Откройте браузер и перейдите в Центр администрирования Microsoft Entra и войдите с помощью учетной записи глобального администратора.
Выберите Идентификатор Microsoft Entra в области навигации слева, разверните узел Удостоверение, Приложения, а затем выберите Регистрация приложений.
Выберите Новая регистрация. Введите имя приложения, например
Graph User Auth Tutorial
.Задайте поддерживаемые типы учетных записей . Доступны следующие варианты:
Вариант Кто может выполнить вход? Учетные записи только в этом каталоге организации Только пользователи в организации Microsoft 365 Учетные записи в любом каталоге организации Пользователи в любой организации Microsoft 365 (рабочие или учебные учетные записи) Учетные записи в любом каталоге организации... и личные учетные записи Майкрософт Пользователи в любой организации Microsoft 365 (рабочие или учебные учетные записи) и личные учетные записи Майкрософт Оставьте поле URI перенаправления пустым.
Нажмите Зарегистрировать. На странице Обзор приложения скопируйте значение идентификатора приложения (клиента) и сохраните его. Оно понадобится на следующем шаге. Если вы выбрали Учетные записи в этом каталоге организации только для поддерживаемых типов учетных записей, скопируйте идентификатор каталога (клиента) и сохраните его.
Выберите пункт Проверка подлинности в разделе Управление. Найдите раздел Дополнительные параметры и установите переключатель Разрешить общедоступные клиентские потоки на Да, а затем нажмите кнопку Сохранить.
Примечание.
Обратите внимание, что вы не настроили разрешения Microsoft Graph для регистрации приложения. Это связано с тем, что в примере используется динамическое согласие для запроса определенных разрешений для проверки подлинности пользователя.
Создание консольного приложения PHP
Начните с инициализации нового проекта Composer. Откройте интерфейс командной строки (CLI) в каталоге, в котором вы хотите создать проект. Выполните следующую команду.
composer init
Ответьте на запросы. Вы можете принять значения по умолчанию для большинства вопросов, но ответить на n
следующие вопросы:
Would you like to define your dependencies (require) interactively [yes]? n
Would you like to define your dev dependencies (require-dev) interactively [yes]? n
Add PSR-4 autoload mapping? Maps namespace "Microsoft\Graphtutorial" to the entered relative path. [src/, n to skip]: n
Установка зависимостей
Прежде чем переходить дальше, добавьте некоторые дополнительные зависимости, которые будут использоваться позже.
- Пакет SDK Microsoft Graph для PHP для выполнения вызовов к Microsoft Graph.
- vlucas/phpdotenv для чтения переменных среды из ENV-файлов.
Выполните следующую команду в интерфейсе командной строки, чтобы установить зависимости.
composer require microsoft/microsoft-graph vlucas/phpdotenv
Загрузка параметров приложения
В этом разделе вы добавите в проект сведения о регистрации приложения.
Создайте файл в корневом каталоге проекта с именем .env и добавьте следующий код.
CLIENT_ID=YOUR_CLIENT_ID_HERE TENANT_ID=common GRAPH_USER_SCOPES='user.read mail.read mail.send'
Обновите значения в соответствии со следующей таблицей.
Параметр Значение CLIENT_ID
Идентификатор клиента для регистрации приложения TENANT_ID
Если вы выбрали параметр, разрешать вход только пользователям в вашей организации, измените это значение на идентификатор клиента. В противном случае оставьте значение common
.Важно!
Если вы используете систему управления версиями, например Git, то теперь лучше исключить ENV-файл из системы управления версиями, чтобы избежать случайной утечки идентификатора приложения.
Проектирование приложения
В этом разделе вы создадите простое меню на основе консоли.
Создайте файл в корневом каталоге проекта с именем main.php. Добавьте открывающий и закрывающий теги PHP.
<?php ?>
Добавьте следующий код между тегами PHP.
// Enable loading of Composer dependencies require_once realpath(__DIR__ . '/vendor/autoload.php'); require_once 'GraphHelper.php'; print('PHP Graph Tutorial'.PHP_EOL.PHP_EOL); // Load .env file $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load(); $dotenv->required(['CLIENT_ID', 'TENANT_ID', 'GRAPH_USER_SCOPES']); initializeGraph(); greetUser(); $choice = -1; while ($choice != 0) { echo('Please choose one of the following options:'.PHP_EOL); echo('0. Exit'.PHP_EOL); echo('1. Display access token'.PHP_EOL); echo('2. List my inbox'.PHP_EOL); echo('3. Send mail'.PHP_EOL); echo('4. Make a Graph call'.PHP_EOL); $choice = (int)readline(''); switch ($choice) { case 1: displayAccessToken(); break; case 2: listInbox(); break; case 3: sendMail(); break; case 4: makeGraphCall(); break; case 0: default: print('Goodbye...'.PHP_EOL); } }
Добавьте следующие методы заполнителей в конец файла перед закрывающим тегом PHP. Вы будете реализовывать их на последующих шагах.
function initializeGraph(): void { // TODO } function greetUser(): void { // TODO } function displayAccessToken(): void { // TODO } function listInbox(): void { // TODO } function sendMail(): void { // TODO } function makeGraphCall(): void { // TODO }
Это реализует базовое меню и считывает выбор пользователя из командной строки.
Добавление проверки подлинности пользователя
В этом разделе описано, как расширить приложение из предыдущего упражнения для поддержки проверки подлинности с помощью Azure AD. Это необходимо для получения необходимого маркера доступа OAuth для вызова Microsoft Graph.
Создание поставщика маркеров доступа
Пакет SDK для Microsoft Graph включает поставщиков проверки подлинности на основе клиента PHP League OAuth2. Однако в этом руководстве вы будете использовать поток кода устройства для получения маркеров доступа. Включенные поставщики проверки подлинности не реализуют этот поток, поэтому вы реализуете настраиваемый поставщик маркеров доступа.
Создайте файл в корневом каталоге проекта с именем DeviceCodeTokenProvider.php. Добавьте в него указанный ниже код.
<?php // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. use GuzzleHttp\Client; use Http\Promise\FulfilledPromise; use Http\Promise\Promise; use Http\Promise\RejectedPromise; use Microsoft\Kiota\Abstractions\Authentication\AccessTokenProvider; use Microsoft\Kiota\Abstractions\Authentication\AllowedHostsValidator; class DeviceCodeTokenProvider implements AccessTokenProvider { private string $clientId; private string $tenantId; private string $scopes; private AllowedHostsValidator $allowedHostsValidator; private string $accessToken; private Client $tokenClient; public function __construct(string $clientId, string $tenantId, string $scopes) { $this->clientId = $clientId; $this->tenantId = $tenantId; $this->scopes = $scopes; $this->allowedHostsValidator = new AllowedHostsValidator(); $this->allowedHostsValidator->setAllowedHosts([ "graph.microsoft.com", "graph.microsoft.us", "dod-graph.microsoft.us", "graph.microsoft.de", "microsoftgraph.chinacloudapi.cn" ]); $this->tokenClient = new Client(); } public function getAuthorizationTokenAsync(string $url, array $additionalAuthenticationContext = []): Promise { $parsedUrl = parse_url($url); $scheme = $parsedUrl["scheme"] ?? null; if ($scheme !== 'https' || !$this->getAllowedHostsValidator()->isUrlHostValid($url)) { return new FulfilledPromise(null); } // If we already have a user token, just return it // Tokens are valid for one hour, after that it needs to be refreshed if (isset($this->accessToken)) { return new FulfilledPromise($this->accessToken); } // https://learn.microsoft.com/azure/active-directory/develop/v2-oauth2-device-code $deviceCodeRequestUrl = 'https://login.microsoftonline.com/'.$this->tenantId.'/oauth2/v2.0/devicecode'; $tokenRequestUrl = 'https://login.microsoftonline.com/'.$this->tenantId.'/oauth2/v2.0/token'; // First POST to /devicecode $deviceCodeResponse = json_decode($this->tokenClient->post($deviceCodeRequestUrl, [ 'form_params' => [ 'client_id' => $this->clientId, 'scope' => $this->scopes ] ])->getBody()->getContents()); // Display the user prompt print($deviceCodeResponse->message.PHP_EOL); // Response also indicates how often to poll for completion // And gives a device code to send in the polling requests $interval = (int)$deviceCodeResponse->interval; $device_code = $deviceCodeResponse->device_code; // Do polling - if attempt times out the token endpoint // returns an error while (true) { sleep($interval); // POST to the /token endpoint $tokenResponse = $this->tokenClient->post($tokenRequestUrl, [ 'form_params' => [ 'client_id' => $this->clientId, 'grant_type' => 'urn:ietf:params:oauth:grant-type:device_code', 'device_code' => $device_code ], // These options are needed to enable getting // the response body from a 4xx response 'http_errors' => false, 'curl' => [ CURLOPT_FAILONERROR => false ] ]); if ($tokenResponse->getStatusCode() == 200) { // Return the access_token $responseBody = json_decode($tokenResponse->getBody()->getContents()); $this->accessToken = $responseBody->access_token; return new FulfilledPromise($responseBody->access_token); } else if ($tokenResponse->getStatusCode() == 400) { // Check the error in the response body $responseBody = json_decode($tokenResponse->getBody()->getContents()); if (isset($responseBody->error)) { $error = $responseBody->error; // authorization_pending means we should keep polling if (strcmp($error, 'authorization_pending') != 0) { return new RejectedPromise( new Exception('Token endpoint returned '.$error, 100)); } } } } } public function getAllowedHostsValidator(): AllowedHostsValidator { return $this->allowedHostsValidator; } } ?>
Настройка клиента Graph для проверки подлинности пользователей
В этом разделе вы будете DeviceCodeTokenProvider
использовать класс для запроса маркера доступа с помощью потока кода устройства.
Создайте файл в корневом каталоге проекта с именем GraphHelper.php. Добавьте в него указанный ниже код.
<?php class GraphHelper { } ?>
Добавьте следующие
using
инструкции в теги PHP.use Microsoft\Graph\Generated\Models; use Microsoft\Graph\Generated\Users\Item\MailFolders\Item\Messages\MessagesRequestBuilderGetQueryParameters; use Microsoft\Graph\Generated\Users\Item\MailFolders\Item\Messages\MessagesRequestBuilderGetRequestConfiguration; use Microsoft\Graph\Generated\Users\Item\SendMail\SendMailPostRequestBody; use Microsoft\Graph\Generated\Users\Item\UserItemRequestBuilderGetQueryParameters; use Microsoft\Graph\Generated\Users\Item\UserItemRequestBuilderGetRequestConfiguration; use Microsoft\Graph\GraphRequestAdapter; use Microsoft\Graph\GraphServiceClient; use Microsoft\Kiota\Abstractions\Authentication\BaseBearerTokenAuthenticationProvider; require_once 'DeviceCodeTokenProvider.php';
Добавьте приведенный ниже код в класс
GraphHelper
.private static string $clientId = ''; private static string $tenantId = ''; private static string $graphUserScopes = ''; private static DeviceCodeTokenProvider $tokenProvider; private static GraphServiceClient $userClient; public static function initializeGraphForUserAuth(): void { GraphHelper::$clientId = $_ENV['CLIENT_ID']; GraphHelper::$tenantId = $_ENV['TENANT_ID']; GraphHelper::$graphUserScopes = $_ENV['GRAPH_USER_SCOPES']; GraphHelper::$tokenProvider = new DeviceCodeTokenProvider( GraphHelper::$clientId, GraphHelper::$tenantId, GraphHelper::$graphUserScopes); $authProvider = new BaseBearerTokenAuthenticationProvider(GraphHelper::$tokenProvider); $adapter = new GraphRequestAdapter($authProvider); GraphHelper::$userClient = GraphServiceClient::createWithRequestAdapter($adapter); }
Замените пустую
initializeGraph
функцию в main.php следующим кодом.function initializeGraph(): void { GraphHelper::initializeGraphForUserAuth(); }
Этот код загружает сведения из ENV-файла и инициализирует два свойства: DeviceCodeTokenProvider
объект и GraphServiceClient
объект . Объект DeviceCodeTokenProvider
будет использоваться для запроса маркера доступа, а GraphServiceClient
объект будет использоваться для вызовов Microsoft Graph.
Тестирование потока кода устройства
Затем добавьте код для получения маркера доступа из GraphHelper
.
Добавьте к классу
GraphHelper
следующую функцию:public static function getUserToken(): string { return GraphHelper::$tokenProvider ->getAuthorizationTokenAsync('https://graph.microsoft.com')->wait(); }
Замените пустую
displayAccessToken
функцию в main.php следующим кодом.function displayAccessToken(): void { try { $token = GraphHelper::getUserToken(); print('User token: '.$token.PHP_EOL.PHP_EOL); } catch (Exception $e) { print('Error getting access token: '.$e->getMessage().PHP_EOL.PHP_EOL); } }
Выполните сборку и запуск приложения. Введите
1
при появлении запроса на выбор параметра. Приложение отображает URL-адрес и код устройства.$ php main.php PHP Graph Tutorial 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 1 To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code RB2RUD56D to authenticate.
Откройте браузер и перейдите по url-адресу. Введите предоставленный код и войдите в систему.
Важно!
Помните о всех существующих учетных записях Microsoft 365, которые вошли в браузер при просмотре страницы
https://microsoft.com/devicelogin
. Используйте функции браузера, такие как профили, гостевой режим или частный режим, чтобы проверить подлинность в качестве учетной записи, которую вы планируете использовать для тестирования.После завершения вернитесь к приложению, чтобы увидеть маркер доступа.
Совет
Только для проверки и отладки можно декодировать маркеры доступа пользователей (только для рабочих или учебных учетных записей) с помощью средства синтаксического анализа токенов Майкрософт в сети по адресу https://jwt.ms. Это может быть полезно, если при вызове Microsoft Graph возникают ошибки маркера. Например, убедитесь, что
scp
утверждение в маркере содержит ожидаемые области разрешений Microsoft Graph.
Получение пользователя
В этом разделе описано, как включить Microsoft Graph в приложение. Для этого приложения вы будете использовать пакет SDK Microsoft Graph для PHP для выполнения вызовов Microsoft Graph.
Добавьте приведенный ниже код в класс
GraphHelper
.public static function getUser(): Models\User { $configuration = new UserItemRequestBuilderGetRequestConfiguration(); $configuration->queryParameters = new UserItemRequestBuilderGetQueryParameters(); $configuration->queryParameters->select = ['displayName','mail','userPrincipalName']; return GraphHelper::$userClient->me()->get($configuration)->wait(); }
Замените пустую
greetUser
функцию в main.php следующим кодом.function greetUser(): void { try { $user = GraphHelper::getUser(); print('Hello, '.$user->getDisplayName().'!'.PHP_EOL); // For Work/school accounts, email is in Mail property // Personal accounts, email is in UserPrincipalName $email = $user->getMail(); if (empty($email)) { $email = $user->getUserPrincipalName(); } print('Email: '.$email.PHP_EOL.PHP_EOL); } catch (Exception $e) { print('Error getting user: '.$e->getMessage().PHP_EOL.PHP_EOL); } }
Если вы запустите приложение сейчас, после входа в приложение будет приветствовать вас по имени.
Hello, Megan Bowen!
Email: MeganB@contoso.com
Описание кода
Рассмотрим код в getUser
функции. Это всего несколько строк, но есть некоторые ключевые детали, которые следует обратить внимание.
Доступ к "мне"
Функция создает запрос к API Get user API. Этот API доступен двумя способами:
GET /me
GET /users/{user-id}
В этом случае код вызывает конечную точку GET /me
API. Это ярлык, который позволяет получить пользователя, прошедшего проверку подлинности, не зная его идентификатора пользователя.
Примечание.
GET /me
Так как конечная точка API получает пользователя, прошедшего проверку подлинности, она доступна только для приложений, использующих проверку подлинности пользователей. Приложения для проверки подлинности только для приложений не могут получить доступ к этой конечной точке.
Запрос определенных свойств
Функция использует параметр запроса $select для указания набора необходимых свойств.
Строго типизированный тип возвращаемого значения
Функция возвращает объект, User
десериализованный из ответа JSON из API. Так как код использует $select
, только запрошенные свойства будут иметь значения в возвращаемом объекте User
. Все остальные свойства будут иметь значения по умолчанию.
Перечисление папки "Входящие"
В этом разделе вы добавите возможность выводить список сообщений в папке "Входящие" пользователя.
Добавьте приведенный ниже код в класс
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(); }
Замените пустую
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); } }
Запустите приложение, войдите в систему и выберите вариант 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
функции.
Доступ к известным почтовым папкам
Функция передается /me/mailFolders/inbox/messages
в построитель запросов, который создает запрос к API списка сообщений . Так как он включает сегмент /mailFolders/inbox
, API будет возвращать только сообщения в папке запрошенной почты. В этом случае, так как папка "Входящие" является хорошо известной папкой по умолчанию в почтовом ящике пользователя, она доступна по известному имени. Доступ к папкам, не используемым по умолчанию, можно получить таким же образом, заменив известное имя свойством идентификатора почтовой папки. Дополнительные сведения о доступных известных именах папок см. в разделе Тип ресурса mailFolder.
Доступ к коллекции
getUser
В отличие от функции из предыдущего раздела, которая возвращает один объект, этот метод возвращает коллекцию сообщений. Большинство API в Microsoft Graph, возвращающих коллекцию, не возвращают все доступные результаты в одном ответе. Вместо этого они используют разбиение на страницы , чтобы вернуть часть результатов, предоставляя метод для клиентов, чтобы запросить следующую "страницу".
Размеры страниц по умолчанию
API, использующие разбиение на страницы, реализуют размер страницы по умолчанию. Для сообщений значение по умолчанию — 10. Клиенты могут запрашивать больше (или меньше) с помощью параметра запроса $top . В getInbox
это выполняется с помощью queryParameters->top
свойства в параметрах запроса.
Примечание.
Переданное значение queryParameters->top
является верхней границей, а не явным числом. API возвращает количество сообщений до указанного значения.
Получение последующих страниц
Если на сервере доступно больше результатов, ответы коллекции содержат @odata.nextLink
свойство с URL-адресом API для доступа к следующей странице. Пакет SDK для PHP предоставляет его в getOdataNextLink
качестве метода для объектов запросов на коллекцию. Если этот метод возвращает непустую строку, доступны дополнительные результаты. Дополнительные сведения см. в разделе Страница через коллекцию с помощью пакетов SDK Microsoft Graph.
Сортировка коллекций
Функция использует параметр запроса $orderby для запроса результатов, отсортированных по времени получения сообщения (receivedDateTime
свойство). Он включает ключевое DESC
слово, чтобы сообщения, полученные в последнее время, отображались первыми.
Отправка почты
В этом разделе вы добавите возможность отправки сообщения электронной почты в качестве пользователя, прошедшего проверку подлинности.
Добавьте приведенный ниже код в класс
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(); }
Замените пустую
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, чтобы отправить себе сообщение электронной почты.
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.
Чтобы убедиться, что сообщение получено, выберите вариант 2, чтобы получить список папки "Входящие".
Описание кода
Рассмотрим код в sendMail
функции.
Отправка почты
Функция использует построитель $userClient->me()->sendMail()
запросов, который создает запрос к API отправки почты . Построитель запросов принимает текст запроса, содержащий сообщение для отправки.
Создание объектов
В отличие от предыдущих вызовов Microsoft Graph, которые считывают только данные, этот вызов создает данные. Для этого с помощью клиентской библиотеки вы создаете ассоциативный массив, представляющий данные, задаете требуемые свойства, а затем отправляете их в вызове API. Так как вызов отправляет данные, POST
вместо используется GET
метод .
Необязательно: добавление собственного кода
В этом разделе вы добавите в приложение собственные возможности Microsoft Graph. Это может быть фрагмент кода из документации Microsoft Graph или обозревателя Graph или созданный вами код. Этот раздел является необязательным.
Обновите приложение
Добавьте приведенный ниже код в класс
GraphHelper
.public static function makeGraphCall(): void { // INSERT YOUR CODE HERE }
Замените пустую
makeGraphCall
функцию в main.php следующим кодом.function makeGraphCall(): void { try { GraphHelper::makeGraphCall(); } catch (Exception $e) { print(PHP_EOL.'Error making Graph call'.PHP_EOL.PHP_EOL); } }
Выбор API
Найдите API в Microsoft Graph, который вы хотите попробовать. Например, API создания событий . Вы можете использовать один из примеров из документации по API или создать собственный запрос API.
Настройка разрешений
Ознакомьтесь с разделом Разрешения справочной документации по выбранному API, чтобы узнать, какие методы проверки подлинности поддерживаются. Некоторые API не поддерживают только приложения или личные учетные записи Майкрософт, например.
- Чтобы вызвать API с проверкой подлинности пользователя (если API поддерживает проверку подлинности пользователя (делегированную), добавьте требуемую область разрешений в .env.
- Чтобы вызвать API с проверкой подлинности только для приложений, ознакомьтесь с руководством по проверке подлинности только для приложений .
Добавление кода
Добавьте код в функцию makeGraphCall
в GraphHelper.php.
Поздравляем!
Вы завершили работу с руководством по PHP Microsoft Graph. Теперь, когда у вас есть рабочее приложение, которое вызывает Microsoft Graph, вы можете экспериментировать и добавлять новые функции.
- Узнайте, как использовать проверку подлинности только для приложений с пакетом SDK для PHP для Microsoft Graph.
- Просмотрите обзор Microsoft Graph , чтобы просмотреть все данные, к которым можно получить доступ с помощью Microsoft Graph.
Примеры PHP
Возникла проблема с этим разделом? Если это так, отправьте нам отзыв, чтобы мы исправили этот раздел.