通过 PHP 读取微软邮箱(Outlook/Office 365 邮箱)邮件,通常需要使用 Microsoft Graph API,因为微软逐步淘汰了基于用户名和密码的 IMAP/SMTP 方式。Microsoft Graph API 支持 OAuth2.0 认证,可以安全地访问和管理用户邮件。
以下是实现读取微软邮箱邮件的完整示例。
实现步骤
1. 准备工作
1.1 注册 Azure 应用
- 登录到 Azure Portal。
- 转到 Azure Active Directory > 应用注册 > 新注册。
- 填写以下信息:
- 名称:填写你的应用名称。
- 支持的帐户类型:选择适合的帐户类型(如组织和个人)。
- 重定向 URI:设置为
http://localhost
或你的回调地址。
- 点击 注册 完成。
1.2 配置 API 权限
- 选择刚刚注册的应用,在 API 权限 中,添加以下权限:
- Microsoft Graph > Mail.Read(读取邮件)。
- Microsoft Graph > offline_access(获取刷新令牌)。
- 点击 授予管理员同意,确保权限被激活。
1.3 获取应用的客户端 ID 和密钥
- 转到 证书和密钥,生成新的客户端密钥,并保存密钥值(只显示一次)。
- 记录以下信息:
- 应用(客户端)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. 常见问题
- 授权失败:检查 Azure 应用的权限是否正确,确保授权 URL 和回调地址一致。
- 邮件读取为空:确保邮箱中有邮件,且正确授权了
Mail.Read
权限。 - 令牌过期:实现令牌的自动刷新,保存
refresh_token
并使用它请求新令牌。
通过上述步骤,您可以使用 PHP 读取微软邮箱的邮件。如果需要进一步功能(如发送邮件、管理日历),可以扩展使用 Microsoft Graph API 的相关端点。
发布者:myrgd,转载请注明出处:https://www.object-c.cn/4535