通过 PHP 读取微软邮箱(Outlook/Office 365 邮箱)

通过 PHP 读取微软邮箱Outlook/Office 365 邮箱)邮件,通常需要使用 Microsoft Graph API,因为微软逐步淘汰了基于用户名和密码的 IMAP/SMTP 方式。Microsoft Graph API 支持 OAuth2.0 认证,可以安全地访问和管理用户邮件。

以下是实现读取微软邮箱邮件的完整示例。

实现步骤

1. 准备工作

1.1 注册 Azure 应用

  1. 登录到 Azure Portal
  2. 转到 Azure Active Directory > 应用注册 > 新注册
  3. 填写以下信息:
    • 名称:填写你的应用名称。
    • 支持的帐户类型:选择适合的帐户类型(如组织和个人)。
    • 重定向 URI:设置为 http://localhost 或你的回调地址。
  4. 点击 注册 完成。

1.2 配置 API 权限

  1. 选择刚刚注册的应用,在 API 权限 中,添加以下权限:
    • Microsoft Graph > Mail.Read(读取邮件)。
    • Microsoft Graph > offline_access(获取刷新令牌)。
  2. 点击 授予管理员同意,确保权限被激活。

1.3 获取应用的客户端 ID 和密钥

  1. 转到 证书和密钥,生成新的客户端密钥,并保存密钥值(只显示一次)。
  2. 记录以下信息:
    • 应用(客户端)ID
    • 目录(租户)ID
    • 客户端密钥

2. 安装必要的 PHP 包

使用 Microsoft Graph PHP SDK 或直接调用 REST API。推荐使用 league/oauth2-client 库进行 OAuth2.0 授权。

安装依赖

composer require league/oauth2-client
composer require microsoft/microsoft-graph

3. PHP 示例代码

以下代码实现了授权和读取邮件:

3.1 获取 OAuth 令牌

<?php
require 'vendor/autoload.php';

use League\OAuth2\Client\Provider\GenericProvider;

// 配置 OAuth2 客户端
$provider = new GenericProvider([
    'clientId'                => 'YOUR_CLIENT_ID',     // Azure 应用的客户端 ID
    'clientSecret'            => 'YOUR_CLIENT_SECRET', // Azure 应用的客户端密钥
    'redirectUri'             => 'http://localhost',   // 回调地址
    'urlAuthorize'            => 'https://login.microsoftonline.com/YOUR_TENANT_ID/oauth2/v2.0/authorize',
    'urlAccessToken'          => 'https://login.microsoftonline.com/YOUR_TENANT_ID/oauth2/v2.0/token',
    'urlResourceOwnerDetails' => '',
    'scopes'                  => 'Mail.Read offline_access'
]);

// 检查是否有授权码
if (!isset($_GET['code'])) {
    // 重定向到授权 URL
    $authorizationUrl = $provider->getAuthorizationUrl();
    session_start();
    $_SESSION['oauth2state'] = $provider->getState();
    header('Location: ' . $authorizationUrl);
    exit;
} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
    // CSRF 检查失败
    unset($_SESSION['oauth2state']);
    exit('Invalid state');
}

// 获取访问令牌
$accessToken = $provider->getAccessToken('authorization_code', [
    'code' => $_GET['code']
]);

echo 'Access Token: ' . $accessToken->getToken();

3.2 读取邮件

通过 Microsoft Graph SDK 或直接调用 REST API 获取邮件。

<?php
require 'vendor/autoload.php';

use Microsoft\Graph\Graph;
use Microsoft\Graph\Model;

// 使用获取的 Access Token
$accessToken = 'YOUR_ACCESS_TOKEN'; // 从上一步获取

$graph = new Graph();
$graph->setAccessToken($accessToken);

// 获取邮件
try {
    $messages = $graph->createRequest("GET", "/me/messages")
        ->setReturnType(Model\Message::class)
        ->execute();

    foreach ($messages as $message) {
        echo "Subject: " . $message->getSubject() . PHP_EOL;
        echo "From: " . $message->getFrom()->getEmailAddress()->getAddress() . PHP_EOL;
        echo "Body Preview: " . $message->getBodyPreview() . PHP_EOL;
        echo "----------------------------------" . PHP_EOL;
    }
} catch (Exception $e) {
    echo "Error: " . $e->getMessage();
}

4. 调试和优化

  • 错误处理:捕获令牌过期或无效的异常,使用刷新令牌重新获取 Access Token。
  • 分页处理:邮件列表可能分页,使用 Graph API 的 @odata.nextLink 获取下一页数据。
  • 日志记录:记录请求和响应,便于调试。

5. 常见问题

  1. 授权失败:检查 Azure 应用的权限是否正确,确保授权 URL 和回调地址一致。
  2. 邮件读取为空:确保邮箱中有邮件,且正确授权了 Mail.Read 权限。
  3. 令牌过期:实现令牌的自动刷新,保存 refresh_token 并使用它请求新令牌。

通过上述步骤,您可以使用 PHP 读取微软邮箱的邮件。如果需要进一步功能(如发送邮件、管理日历),可以扩展使用 Microsoft Graph API 的相关端点。

发布者:myrgd,转载请注明出处:https://www.object-c.cn/4535

Like (0)
Previous 2024年11月25日 下午7:17
Next 2024年11月25日 下午7:30

相关推荐

  • 本地部署VMware ESXi服务并实现实现无公网IP远程访问服务器

    要在本地部署 VMware ESXi 服务,并实现无公网 IP 的情况下远程访问和管理 ESXi 服务器,您可以通过以下几种方法来完成。这些方法包括使用 VPN、反向代理、NAT(端口转发)等方式。下面是具体步骤和建议。 1. 使用 VPN(虚拟私人网络)访问 通过 VPN 将远程客户端与本地网络连接,从而可以通过局域网(LAN)访问 VMware ESXi…

    2024年11月24日
    00
  • STM32 的串口(RS485)数据收发通信模式

    STM32 的串口(RS485)数据收发需要使用 RS485 协议,这是一种常用于工业设备和长距离通信的串行通讯标准。RS485 支持半双工通信,即数据可以在同一线路上进行收发。STM32 支持通过 UART 串口来配置 RS485 模式,利用硬件流控制进行数据收发。以下是实现 STM32 与 RS485 数据收发的基本步骤。 1. 硬件连接 RS485 与…

    2024年11月25日
    00
  • 在 .NET 8 框架中使用 Web API 项目并通过引用 SqlSugar ORM 来操作数据库

    在 .NET 8 框架中使用 Web API 项目并通过引用 SqlSugar ORM 来操作数据库,可以遵循以下步骤: 1. 准备工作确保已安装 .NET 8 SDK 和 SqlSugar NuGet 包。创建或打开现有的 Web Core API 项目。安装 SqlSugar NuGet 包: 2. 配置 SqlSugar在 Web API 项目中配置 …

    2024年11月27日
    00
  • 在 Spring Boot 中实现 Callback 回调的常用方法

    在 Spring Boot 中实现 Callback(回调) 通常用于处理外部系统调用你的服务接口。例如,当一个第三方服务完成某项操作后通知你的应用完成结果。以下是实现回调的完整流程: 1. 回调的基本流程 2. 示例代码 2.1 创建回调接口 假设第三方服务会通过 POST 请求回调数据到 /callback,并发送如下 JSON 数据: 实现代码如下: …

    2024年11月24日
    00
  • 云服务器的 宝塔面板 中配置 PHP 支持 WebP 格式的图片

    在云服务器的 宝塔面板 中配置 PHP 支持 WebP 格式的图片,主要是通过安装或启用 GD 库或者 ImageMagick 来实现 WebP 图片的处理支持。下面是一步步的操作方法:1. 确保服务器已经安装 WebP 扩展WebP 格式的支持需要 PHP 依赖于 GD 库或 ImageMagick 库。如果你使用的是 PHP 7.0 及以上版本,通常 G…

    2024年11月29日
    00
  • Unity 项目升级URP/HDRP渲染管线时如何解决材质丢失问题

    在 Unity 项目中升级到 URP(通用渲染管线) 或 HDRP(高清渲染管线) 后,材质丢失是一个常见问题。这通常是因为原来的材质或着色器不兼容新渲染管线,需要手动调整或重新配置。以下是详细的解决方法: 1. 理解渲染管线的变化 2. 自动转换材质(官方工具) Unity 提供了从 Built-in 渲染管线迁移到 URP 或 HDRP 的官方工具,可以…

    2024年11月25日
    00
  • Apache DolphinScheduler 一款分布式大数据工作流调度系统

    Apache DolphinScheduler 是一款分布式大数据工作流调度系统。Task 是其核心组件之一,用于定义和调度具体的任务。以下是基于 Apache DolphinScheduler 3.1.9 的 Task 处理流程的解析: 1. Task 提交 在 DolphinScheduler 中,Task 的生命周期通常由用户提交一个具体的任务定义开始…

    2024年12月7日
    00
  • 修复 Elementor 网站上出现的 HTTPS 400 错误请求(服务器错误)

    在修复 Elementor 网站上出现的 HTTPS 400 错误请求(服务器错误)时,您需要采取以下步骤来排查和解决问题。这类错误通常与服务器配置、插件冲突或 HTTPS 配置相关。 1. 检查 HTTPS 配置 2. 排查插件冲突 3. 检查主题兼容性 4. 调整服务器配置 URL 重写规则: 5. 清理缓存 6. 检查网络请求 7. 联系主机服务商 如…

    2024年12月9日
    00
  • 开源工具 Flowise 构建可视化的 AI 工作流

    Flowise 是一个开源的工具,用于构建可视化的 AI 工作流和对话代理。通过 Flowise,用户可以快速集成各种大语言模型(LLM)并与数据库交互。以下是详细的本地部署教程: 1. 前置条件 1.1 硬件和系统要求 1.2 软件要求 2. 本地部署步骤 2.1 克隆 Flowise 代码库 2.2 安装依赖 2.3 配置环境变量 2.4 启动服务 运行…

    2024年11月24日
    00
  • 在 Ubuntu 20.04 上安装 CUDA (Compute Unified Device Architecture) 支持 NVIDIA GPU 的加速计算

    在 Ubuntu 20.04 上安装 CUDA (Compute Unified Device Architecture) 是为了支持 NVIDIA GPU 的加速计算。下面是详细的步骤,包括安装 CUDA、相关驱动以及 cuDNN(用于深度学习的库)。 步骤 1:检查系统要求 步骤 2:安装 NVIDIA 驱动 2. 添加 NVIDIA PPA: 你可以使…

    2024年11月24日
    00
  • 使用 OpenVPN 将多个局域网互联的一种配置方案

    使用 OpenVPN 将多个局域网互联是一个常见需求,尤其是在远程办公或多地分支机构互联场景下。以下是一种基于 OpenVPN 的配置方案,旨在实现多个局域网的互联。 场景说明 网络拓扑图 配置步骤 1. 安装 OpenVPN 在所有相关设备上安装 OpenVPN。以下以 Linux 为例: 2. 配置 OpenVPN 服务器 创建服务器配置文件 编辑 /e…

    2024年12月7日
    00
  • pywebview 页面请求数据总是报错:TypeError: Cannot read properties of undefined (reading ‘api’)

    pywebview 中的 TypeError: Cannot read properties of undefined (reading ‘api’) 错误通常意味着 JavaScript 代码试图访问一个未定义的对象或属性(如 api)。这种问题通常出现在 Python 与前端 JavaScript 交互时,可能是由于以下原因:可能的原因及解决方法:Jav…

    2024年11月27日
    00
  • 在微信公众号开发中获取 access_token 调用微信服务器端接口

    在微信公众号开发中,获取 access_token 是调用微信服务器端接口的第一步。access_token 是接口调用的凭据,可以通过微信公众号的接口调用。 以下是获取 access_token 的步骤和代码示例: 1. 获取 Access Token 的接口 调用微信服务器接口获取 access_token: 接口地址: 返回示例: access_tok…

    2024年12月3日
    00
  • 在工业场景中使用 Apache Flink 处理 Kafka 数据是一种常见的实时流处理方案

    在工业场景中使用 Apache Flink 处理 Kafka 数据是一种常见的实时流处理方案,特别是针对 ChangeRecord 数据类型时,能够帮助实现高效的实时 ETL(提取、转换、加载)或事件驱动的应用。以下是关于如何用 Flink 处理 Kafka 数据,并重点解析 ChangeRecord2 的详细步骤和注意事项。 1. ChangeRecord…

    2024年12月5日
    00
  • uniapp基于vue3,element plus组件库以及axios通讯开发

    在 uniapp 前端开发中,使用 Vue3、Element Plus 组件库和 Axios 进行通讯是一种常见的组合。下面是一个简单的步骤和实践指南,帮助你更好地使用这些工具进行开发。1. 安装和配置 Vue3 和 Element Plus首先,确保你已经安装了 uniapp 项目,并且设置好相关依赖。在项目中,安装 Element Plus 组件库以便在…

    2024年11月27日
    00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

在线咨询: QQ交谈

邮件:723923060@qq.com

关注微信