如何用PHP简便访问Office 365邮箱?(已禁用Basic Authentication)
关于PHP替代Basic Auth访问Office365邮箱的简化方案
不借助第三方工具的话,确实需要在微软开发者平台(Azure AD)注册应用,但可以通过客户端凭证模式的Microsoft Graph API简化开发,不用编写复杂的OAuth交互流程,代码量也能控制在合理范围——刚好满足你读取、删除、移动邮件的需求。
步骤1:注册并配置Azure AD应用
- 登录Azure AD门户,注册一个单租户应用(你的邮箱属于特定租户)。
- 配置重定向URI:选
http://localhost(本地调试用,生产环境可按需修改)。 - 添加API权限:搜索并添加
Microsoft Graph的Mail.ReadWrite权限(该权限覆盖邮件读取、删除、移动操作),然后点击「授予管理员同意」(必须完成这一步,否则后台脚本无法获取权限)。 - 生成客户端密钥:在「证书和密码」页面创建一个客户端密码,保存好租户ID、客户端ID、客户端密钥三个关键信息。
步骤2:获取访问令牌(PHP代码)
用CURL直接请求令牌,无需第三方OAuth库:
$tenantId = '你的租户ID'; $clientId = '你的客户端ID'; $clientSecret = '你的客户端密钥'; $scope = 'https://graph.microsoft.com/.default'; $tokenUrl = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token"; $postData = http_build_query([ 'grant_type' => 'client_credentials', 'client_id' => $clientId, 'client_secret' => $clientSecret, 'scope' => $scope ]); $ch = curl_init($tokenUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $tokenData = json_decode($response, true); $accessToken = $tokenData['access_token'] ?? '';
步骤3:实现邮件操作(PHP代码)
读取邮件
$email = '你的Gabohost邮箱地址'; $apiUrl = "https://graph.microsoft.com/v1.0/users/$email/messages"; $ch = curl_init($apiUrl); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Bearer $accessToken", "Content-Type: application/json" ]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $messages = curl_exec($ch); curl_close($ch); // 解析邮件列表 $messageList = json_decode($messages, true); print_r($messageList['value']);
删除邮件
替换{message-id}为实际的邮件ID:
$messageId = '目标邮件ID'; $apiUrl = "https://graph.microsoft.com/v1.0/users/$email/messages/$messageId"; $ch = curl_init($apiUrl); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Bearer $accessToken", "Content-Type: application/json" ]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch);
移动邮件
先通过GET https://graph.microsoft.com/v1.0/users/$email/mailFolders获取目标文件夹的ID,再执行移动:
$messageId = '目标邮件ID'; $targetFolderId = '目标文件夹ID'; $apiUrl = "https://graph.microsoft.com/v1.0/users/$email/messages/$messageId/move"; $postData = json_encode([ 'destinationId' => $targetFolderId ]); $ch = curl_init($apiUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Bearer $accessToken", "Content-Type: application/json" ]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch);
关键说明
- 客户端凭证模式适合后台运行的脚本,无需用户交互,直接获取权限操作邮箱。
- 相比原来的IMAP代码,确实多了几步,但都是基础的HTTP请求,没有复杂的依赖。
- 确保你的服务器CURL支持HTTPS,并且能访问微软的API域名。
内容的提问来源于stack exchange,提问作者Matilda
相关产品推荐
相关产品推荐

