使用Laravel调用Microsoft Graph API发邮件时遇内部服务器错误
解决Laravel调用Microsoft Graph API发送邮件时的内部服务器错误
核心问题排查与修复
1. 避免手动JSON编码,利用Laravel Http客户端自动处理
你当前代码里手动用json_encode($emailData)作为POST参数,但Laravel的Http::post()会自动把数组转成JSON格式,还会自动设置Content-Type: application/json请求头。手动编码会导致双重JSON编码,这是触发内部服务器错误的常见原因。
修正后的请求代码:
$response = Http::withToken($this->token) ->post("https://graph.microsoft.com/v1.0/users/test@hotmail.com/sendMail", $emailData);
2. 移除不必要的from字段
Microsoft Graph的sendMail接口默认用令牌对应的用户作为发件人,手动指定from字段容易引发权限冲突(除非你的令牌拥有代表其他用户发邮件的权限,比如Mail.Send.Shared或应用权限)。如果你的令牌是test@hotmail.com用户的委托令牌,直接去掉from节点即可:
修正后的$emailData:
$emailData = [ "message" => [ "subject" => 'Test', "body" => [ "contentType" => "text", "content" => "Test Email!" ], "toRecipients" => [ [ "emailAddress" => [ "address" => "test@gmail.com" ] ] ] ] ];
3. 验证令牌权限与用户匹配
- 确认访问令牌包含
Mail.Send权限(委托权限需用户已授权,应用权限需管理员同意)。 - 确认URL中的
test@hotmail.com是令牌对应的用户的UPN(用户主体名称)或用户ID,否则会因权限不足触发错误。
4. 调试响应详情
可以通过以下代码获取更详细的错误信息,帮助定位问题:
// 打印响应状态码和完整内容 dd($response->status(), $response->body());
如果修正后仍有问题,检查返回的错误详情(可能包含更具体的错误代码和描述),再针对性排查权限或配置问题。
内容的提问来源于stack exchange,提问作者Ricky97
相关产品推荐
相关产品推荐

