You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kiota MS Graph SDK for PHP v2.3.0邮件附件为空问题求助

解决方案:修复Kiota MS Graph SDK PHP附件0字节问题

问题根源

你的代码存在两个核心问题:

  1. 类型不匹配错误:Utils::tryFopen()返回的是文件资源流,而非字符串,直接传给base64_decode()会触发类型警告,导致后续内容处理失败。
  2. 编码逻辑颠倒: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 01:03:14