Kiota MS Graph SDK for PHP v2.3.0邮件附件为空问题求助
解决方案:修复Kiota MS Graph SDK PHP附件0字节问题
问题根源
你的代码存在两个核心问题:
- 类型不匹配错误:
Utils::tryFopen()返回的是文件资源流,而非字符串,直接传给base64_decode()会触发类型警告,导致后续内容处理失败。 - 编码逻辑颠倒:Graph API要求附件的
contentBytes是文件内容的Base64编码值,但你错误地对资源流做了解码操作,最终导致附件内容为空。
修正后的代码
$attachment = new FileAttachment(); $attachment->setName($emailAttachment['fileName']); $attachment->setContentType(mime_content_type($emailAttachment['fileLocation'])); // 读取文件内容为字符串 $fileContent = file_get_contents($emailAttachment['fileLocation']); // 对内容进行Base64编码 $base64Content = base64_encode($fileContent); // 将编码后的字符串转为流并设置给附件 $attachment->setContentBytes(Utils::streamFor($base64Content)); $this->attachments[] = $attachment;
关键说明
- 使用
file_get_contents()直接读取文件内容为字符串,避免处理资源流的额外复杂度。 - 必须对文件内容执行
base64_encode(),因为Graph API的contentBytes字段要求传入Base64编码的文件数据。 Utils::streamFor()可以直接接收字符串,将其转换为SDK所需的流类型。
额外建议
- 添加文件存在性检查,避免因文件路径错误导致的异常:
if (!file_exists($emailAttachment['fileLocation'])) { throw new \Exception("Attachment file not found: " . $emailAttachment['fileLocation']); } - 若处理大文件,建议使用流式读取替代
file_get_contents(),避免内存溢出:$stream = Utils::tryFopen($emailAttachment['fileLocation'], 'r'); $attachment->setContentBytes($stream); // 注意:此时不需要手动Base64编码,SDK会自动处理流式内容的编码
内容的提问来源于stack exchange,提问作者JamesB
相关产品推荐
相关产品推荐

