Crear aplicaciones PHP con Microsoft Graph
En este tutorial se explica cómo crear una aplicación de consola PHP que use Microsoft Graph API para acceder a los datos en nombre de un usuario.
Nota:
Para obtener información sobre cómo usar Microsoft Graph para acceder a los datos mediante la autenticación de solo aplicación, consulte este tutorial de autenticación de solo aplicación.
En este tutorial, aprenderá a:
- Obtener el usuario que ha iniciado sesión
- Enumerar los mensajes de bandeja de entrada del usuario
- Enviar correo electrónico
Sugerencia
Como alternativa a seguir este tutorial, puede descargar el código completado a través de la herramienta de inicio rápido , que automatiza el registro y la configuración de aplicaciones. El código descargado funciona sin necesidad de realizar modificaciones.
También puede descargar o clonar el repositorio de GitHub y seguir las instrucciones del ARCHIVO LÉAME para registrar una aplicación y configurar el proyecto.
Requisitos previos
Antes de iniciar este tutorial, debe tener PHP y Composer instalados en la máquina de desarrollo.
También debe tener una cuenta profesional o educativa de Microsoft con un buzón de Exchange Online. Si no tiene un inquilino de Microsoft 365, puede calificar para uno a través del Programa para desarrolladores de Microsoft 365; Para obtener más información, consulte las preguntas más frecuentes. Como alternativa, puede registrarse para obtener una evaluación gratuita de 1 mes o comprar un plan de Microsoft 365.
Nota:
Este tutorial se escribió con php versión 8.1.5 y Composer versión 2.3.5. Los pasos de esta guía pueden funcionar con otras versiones, pero no se han probado.
Registrar la aplicación en el portal
En este ejercicio registrará una nueva aplicación en Azure Active Directory para habilitar la autenticación de usuario. Puede registrar una aplicación mediante el Centro de administración de Microsoft Entra o mediante el SDK de PowerShell de Microsoft Graph.
Registro de la aplicación para la autenticación de usuario
En esta sección registrará una aplicación que admita la autenticación de usuario mediante el flujo de código de dispositivo.
Abra un explorador y vaya al Centro de administración de Microsoft Entra e inicie sesión con una cuenta de administrador global.
Seleccione Microsoft Entra ID en el panel de navegación izquierdo, expanda Identidad, aplicaciones y registros de aplicaciones.
Seleccione Nuevo registro. Escriba un nombre para la aplicación, por ejemplo,
Graph User Auth Tutorial
.Establezca los tipos de cuenta admitidos como desee. Las opciones son:
Opción ¿Quién puede iniciar sesión? Solo las cuentas de este directorio organizativo Solo los usuarios de la organización de Microsoft 365 Cuentas en cualquier directorio organizativo Usuarios de cualquier organización de Microsoft 365 (cuentas profesionales o educativas) Cuentas en cualquier directorio organizativo... y cuentas personales de Microsoft Usuarios de cualquier organización de Microsoft 365 (cuentas profesionales o educativas) y cuentas personales de Microsoft Deje URI de redireccionamiento vacía.
Seleccione Registrar. En la página Información general de la aplicación, copie el valor del identificador de aplicación (cliente) y guárdelo, lo necesitará en el paso siguiente. Si eligió Cuentas en este directorio organizativo solo para los tipos de cuenta admitidos, copie también el identificador de directorio (inquilino) y guárdelo.
Seleccione Autenticación en Administrar. Busque la sección Configuración avanzada y cambie el botón de alternancia Permitir flujos de cliente público a Sí y, a continuación, elija Guardar.
Nota:
Tenga en cuenta que no ha configurado ningún permiso de Microsoft Graph en el registro de la aplicación. Esto se debe a que el ejemplo usa el consentimiento dinámico para solicitar permisos específicos para la autenticación de usuario.
Creación de una aplicación de consola PHP
Empiece por inicializar un nuevo proyecto de Composer. Abra la interfaz de línea de comandos (CLI) en un directorio donde quiera crear el proyecto. Ejecuta el siguiente comando.
composer init
Responda a las indicaciones. Puede aceptar los valores predeterminados para la mayoría de las preguntas, pero responder n
a lo siguiente:
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
Instalar dependencias
Antes de continuar, agregue algunas dependencias adicionales que usará más adelante.
- SDK de Microsoft Graph para PHP para realizar llamadas a Microsoft Graph.
- vlucas/phpdotenv para leer variables de entorno de archivos .env.
Ejecute el siguiente comando en la CLI para instalar las dependencias.
composer require microsoft/microsoft-graph vlucas/phpdotenv
Cargar la configuración de la aplicación
En esta sección agregará los detalles del registro de la aplicación al proyecto.
Cree un archivo en el directorio raíz del proyecto denominado .env y agregue el código siguiente.
CLIENT_ID=YOUR_CLIENT_ID_HERE TENANT_ID=common GRAPH_USER_SCOPES='user.read mail.read mail.send'
Actualice los valores según la tabla siguiente.
Configuración Valor CLIENT_ID
El identificador de cliente del registro de la aplicación TENANT_ID
Si eligió la opción para permitir que solo los usuarios de su organización inicien sesión, cambie este valor por el identificador de inquilino. De lo contrario, deje como common
.Importante
Si usa el control de código fuente como Git, ahora sería un buen momento para excluir el archivo .env del control de código fuente para evitar la pérdida accidental del identificador de aplicación.
Diseñar la aplicación
En esta sección creará un menú simple basado en consola.
Cree un archivo en el directorio raíz del proyecto denominado main.php. Agregue las etiquetas PHP de apertura y cierre.
<?php ?>
Agregue el código siguiente entre las etiquetas 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); } }
Agregue los siguientes métodos de marcador de posición al final del archivo antes de cerrar la etiqueta PHP. Los implementará en pasos posteriores.
function initializeGraph(): void { // TODO } function greetUser(): void { // TODO } function displayAccessToken(): void { // TODO } function listInbox(): void { // TODO } function sendMail(): void { // TODO } function makeGraphCall(): void { // TODO }
Esto implementa un menú básico y lee la elección del usuario desde la línea de comandos.
Agregar autenticación de usuario
En esta sección ampliará la aplicación del ejercicio anterior para admitir la autenticación con Azure AD. Esto es necesario para obtener el token de acceso de OAuth necesario para llamar a Microsoft Graph.
Creación de un proveedor de tokens de acceso
El SDK de Microsoft Graph incluye proveedores de autenticación basados en el cliente OAuth2 de php League. Sin embargo, para este tutorial, usará el flujo de código del dispositivo para obtener tokens de acceso. Los proveedores de autenticación incluidos no implementan este flujo, por lo que implementará un proveedor de tokens de acceso personalizado.
Cree un nuevo archivo en el directorio raíz del proyecto denominado DeviceCodeTokenProvider.php. Agregue el siguiente código.
<?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; } } ?>
Configuración del cliente de Graph para la autenticación de usuario
En esta sección usará la DeviceCodeTokenProvider
clase para solicitar un token de acceso mediante el flujo de código del dispositivo.
Cree un nuevo archivo en el directorio raíz del proyecto denominado GraphHelper.php. Agregue el siguiente código.
<?php class GraphHelper { } ?>
Agregue las siguientes
using
instrucciones dentro de las etiquetas 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';
Agregue el código siguiente a la clase
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); }
Reemplace la función vacía
initializeGraph
en main.php por lo siguiente.function initializeGraph(): void { GraphHelper::initializeGraphForUserAuth(); }
Este código carga información del archivo .env e inicializa dos propiedades, un DeviceCodeTokenProvider
objeto y un GraphServiceClient
objeto . El DeviceCodeTokenProvider
objeto se usará para solicitar un token de acceso y el GraphServiceClient
objeto se usará para realizar llamadas a Microsoft Graph.
Prueba del flujo de código del dispositivo
A continuación, agregue código para obtener un token de acceso de GraphHelper
.
Agregue la siguiente función a la clase
GraphHelper
.public static function getUserToken(): string { return GraphHelper::$tokenProvider ->getAuthorizationTokenAsync('https://graph.microsoft.com')->wait(); }
Reemplace la función vacía
displayAccessToken
en main.php por lo siguiente.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); } }
Compile y ejecute la aplicación. Escriba
1
cuando se le solicite una opción. La aplicación muestra una dirección URL y un código de dispositivo.$ 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.
Abra un explorador y vaya a la dirección URL que se muestra. Escriba el código proporcionado e inicie sesión.
Importante
Tenga en cuenta cualquier cuenta de Microsoft 365 existente que haya iniciado sesión en el explorador al navegar a
https://microsoft.com/devicelogin
. Use características del explorador como perfiles, modo invitado o modo privado para asegurarse de autenticarse como la cuenta que quiere usar para las pruebas.Una vez completado, vuelva a la aplicación para ver el token de acceso.
Sugerencia
Solo con fines de validación y depuración, puede descodificar tokens de acceso de usuario (solo para cuentas profesionales o educativas) mediante el analizador de tokens en línea de Microsoft en https://jwt.ms. Esto puede ser útil si encuentra errores de token al llamar a Microsoft Graph. Por ejemplo, comprobar que la
scp
notificación del token contiene los ámbitos de permiso de Microsoft Graph esperados.
Obtener usuario
En esta sección incorporará Microsoft Graph a la aplicación. Para esta aplicación, usará el SDK de Microsoft Graph para PHP para realizar llamadas a Microsoft Graph.
Agregue el código siguiente a la clase
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(); }
Reemplace la función vacía
greetUser
en main.php por lo siguiente.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); } }
Si ejecuta la aplicación ahora, después de iniciar sesión en la aplicación le da la bienvenida por su nombre.
Hello, Megan Bowen!
Email: MeganB@contoso.com
Código explicado
Tenga en cuenta el código de la getUser
función . Son solo unas pocas líneas, pero hay algunos detalles clave que debe tener en cuenta.
Acceso a 'me'
La función compila una solicitud a la API Get user . Esta API es accesible de dos maneras:
GET /me
GET /users/{user-id}
En este caso, el código llamará al punto de conexión de API GET /me
. Se trata de un método abreviado para obtener el usuario autenticado sin conocer su identificador de usuario.
Nota:
Dado que el GET /me
punto de conexión de API obtiene el usuario autenticado, solo está disponible para las aplicaciones que usan la autenticación de usuario. Las aplicaciones de autenticación de solo aplicación no pueden acceder a este punto de conexión.
Solicitud de propiedades específicas
La función usa el parámetro de consulta $select para especificar el conjunto de propiedades que necesita.
Tipo de valor devuelto fuertemente tipado
La función devuelve un User
objeto deserializado a partir de la respuesta JSON de la API. Dado que el código usa $select
, solo las propiedades solicitadas tendrán valores en el objeto devuelto User
. Todas las demás propiedades tendrán valores predeterminados.
Bandeja de entrada de lista
En esta sección agregará la capacidad de enumerar los mensajes en la bandeja de entrada de correo electrónico del usuario.
Agregue el código siguiente a la clase
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(); }
Reemplace la función vacía
listInbox
en main.php por lo siguiente.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); } }
Ejecute la aplicación, inicie sesión y elija la opción 2 para mostrar la bandeja de entrada.
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
Código explicado
Tenga en cuenta el código de la getInbox
función .
Acceso a carpetas de correo conocidas
La función pasa /me/mailFolders/inbox/messages
al generador de solicitudes, que compila una solicitud a la API De lista de mensajes . Dado que incluye el /mailFolders/inbox
segmento, la API solo devolverá mensajes en la carpeta de correo solicitada. En este caso, dado que la bandeja de entrada es una carpeta predeterminada y conocida dentro del buzón de un usuario, es accesible a través de su nombre conocido. Se obtiene acceso a las carpetas no predeterminadas de la misma manera, reemplazando el nombre conocido por la propiedad id. de la carpeta de correo. Para obtener más información sobre los nombres de carpeta conocidos disponibles, consulte tipo de recurso mailFolder.
Acceso a una colección
A diferencia de la getUser
función de la sección anterior, que devuelve un único objeto, este método devuelve una colección de mensajes. La mayoría de las API de Microsoft Graph que devuelven una colección no devuelven todos los resultados disponibles en una sola respuesta. En su lugar, usan la paginación para devolver una parte de los resultados al tiempo que proporcionan un método para que los clientes soliciten la siguiente "página".
Tamaños de página predeterminados
Las API que usan la paginación implementan un tamaño de página predeterminado. En el caso de los mensajes, el valor predeterminado es 10. Los clientes pueden solicitar más (o menos) mediante el parámetro de consulta $top . En getInbox
, esto se logra con la queryParameters->top
propiedad en los parámetros de consulta.
Nota:
El valor pasado en queryParameters->top
es un límite superior, no un número explícito. La API devuelve una serie de mensajes hasta el valor especificado.
Obtención de páginas posteriores
Si hay más resultados disponibles en el servidor, las respuestas de colección incluyen una @odata.nextLink
propiedad con una dirección URL de API para acceder a la página siguiente. El SDK de PHP expone esto como el método en objetos getOdataNextLink
de solicitud de recopilación. Si este método devuelve una cadena no vacía, hay más resultados disponibles. Para obtener más información, consulte Página a través de una colección mediante los SDK de Microsoft Graph.
Ordenar colecciones
La función usa el parámetro de consulta $orderby para solicitar resultados ordenados por el momento en que se recibe el mensaje (receivedDateTime
propiedad). Incluye la DESC
palabra clave para que los mensajes recibidos más recientemente aparezcan primero.
Enviar correo
En esta sección agregará la capacidad de enviar un mensaje de correo electrónico como usuario autenticado.
Agregue el código siguiente a la clase
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(); }
Reemplace la función vacía
sendMail
en main.php por lo siguiente.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); } }
Ejecute la aplicación, inicie sesión y elija la opción 3 para enviarse un correo electrónico.
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.
Nota:
Si está realizando pruebas con un inquilino para desarrolladores del Programa para desarrolladores de Microsoft 365, es posible que el correo electrónico que envíe no se entregue y que reciba un informe de no entrega. Si esto ocurre, póngase en contacto con el soporte técnico a través del Centro de administración de Microsoft 365.
Para comprobar que se ha recibido el mensaje, elija la opción 2 para mostrar la bandeja de entrada.
Código explicado
Tenga en cuenta el código de la sendMail
función .
Envío de correo
La función usa el generador de $userClient->me()->sendMail()
solicitudes, que compila una solicitud a send mail API. El generador de solicitudes toma un cuerpo de solicitud que contiene el mensaje que se va a enviar.
Creación de objetos
A diferencia de las llamadas anteriores a Microsoft Graph que solo leen datos, esta llamada crea datos. Para hacerlo con la biblioteca cliente, cree una matriz asociativa que represente los datos, establezca las propiedades deseadas y, a continuación, envíelas en la llamada API. Dado que la llamada envía datos, se usa el POST
método en lugar de GET
.
Opcional: agregue su propio código
En esta sección agregará sus propias funcionalidades de Microsoft Graph a la aplicación. Podría tratarse de un fragmento de código de la documentación de Microsoft Graph o del Explorador de Graph, o código que haya creado. Esta sección es opcional.
Actualizar la aplicación
Agregue el código siguiente a la clase
GraphHelper
.public static function makeGraphCall(): void { // INSERT YOUR CODE HERE }
Reemplace la función vacía
makeGraphCall
en main.php por lo siguiente.function makeGraphCall(): void { try { GraphHelper::makeGraphCall(); } catch (Exception $e) { print(PHP_EOL.'Error making Graph call'.PHP_EOL.PHP_EOL); } }
Elección de una API
Busque una API en Microsoft Graph que le gustaría probar. Por ejemplo, create event API. Puede usar uno de los ejemplos de la documentación de la API o crear su propia solicitud de API.
Configurar permisos
Compruebe la sección Permisos de la documentación de referencia de la API elegida para ver qué métodos de autenticación se admiten. Algunas API no admiten solo aplicaciones ni cuentas personales de Microsoft, por ejemplo.
- Para llamar a una API con autenticación de usuario (si la API admite la autenticación de usuario (delegado), agregue el ámbito de permiso necesario en .env.
- Para llamar a una API con autenticación solo de aplicación, consulte el tutorial de autenticación de solo aplicación .
Agregar el código
Agregue el código a la makeGraphCall
función en GraphHelper.php.
¡Enhorabuena!
Ha completado el tutorial de Microsoft Graph de PHP. Ahora que tiene una aplicación en funcionamiento que llama a Microsoft Graph, puede experimentar y agregar nuevas características.
- Obtenga información sobre cómo usar la autenticación solo de aplicación con el SDK de PHP de Microsoft Graph.
- Visite información general de Microsoft Graph para ver todos los datos a los que puede acceder con Microsoft Graph.
Ejemplos de PHP
¿Tiene algún problema con esta sección? Si es así, envíenos sus comentarios para que podamos mejorarla.