使用garethp/php-ews无法获取邮件正文的技术求助
解决garethp/php-ews无法获取邮件正文的问题
问题原因
默认调用getMailItems()时,EWS不会返回邮件正文这类非默认属性,需要显式指定要获取的属性集合;且getBody()返回的是BodyType对象,而非直接字符串,不能直接输出。
解决方案
1. 批量获取时指定包含Body属性
修改getMailItems()的调用参数,显式声明要获取的属性,同时正确解析BodyType对象:
require_once "vendor/autoload.php"; use garethp\ews\API\Type; use garethp\ews\MailAPI; $api = MailAPI::withUsernameAndPassword('server', 'username', 'password'); // 自定义ItemShape,指定要获取Subject和Body属性 $items = $api->getMailItems([ 'ItemShape' => [ 'BaseShape' => 'IdOnly', 'AdditionalProperties' => [ 'FieldURI' => [ ['FieldURI' => 'item:Subject'], ['FieldURI' => 'item:Body'] ] ] ] ]); foreach ($items as $item) { if ($item instanceof Type\MessageType) { $emailId = $item->getItemId()->getId(); $subject = $item->getSubject(); echo "EmailId: " . $emailId . "<br>"; echo "Subject: " . $subject . "<br>"; $body = $item->getBody(); if ($body instanceof Type\BodyType) { $bodyContent = $body->getContent(); $bodyType = $body->getBodyType(); // 可选,获取正文类型(HTML/Text) echo "Body Type: " . $bodyType . "<br>"; echo "Body Content: " . $bodyContent . "<br>"; } else { echo "Body: No content available<br>"; } } }
2. 单独获取单封邮件(更可靠)
如果批量获取仍有问题,可以尝试通过邮件ID单独请求,确保属性完整:
// 在循环中获取到emailId后执行 $singleItem = $api->getMailItem($emailId, [ 'ItemShape' => [ 'BaseShape' => 'Default', 'AdditionalProperties' => [ 'FieldURI' => ['FieldURI' => 'item:Body'] ] ] ]); $body = $singleItem->getBody(); if ($body instanceof Type\BodyType) { echo "Body Content: " . $body->getContent() . "<br>"; }
3. 额外检查点
- 确认EWS服务器允许访问邮件正文,账号具备对应的读取权限
- 若邮件正文是HTML格式,确保输出时正确处理转义字符
内容的提问来源于stack exchange,提问作者ElPandaRojo1
相关产品推荐
相关产品推荐

