我看到你正在使用jamesiarmes/php-ews
的版本php-ews
,所以我会尝试回答这个问题。我可能有点偏离,因为我不使用该版本,并且首先鼓励您升级到我维护和更新的分叉,因为它更容易使用,您会获得更多支持,它是 PSR-2 和 4兼容并仍在维护。它被称为garethp/php-ews。我将首先给出我的答案,因为它简短而简单,然后转到您使用的代码库
使用 garethp/php-ews 解决
本质上它分为三个部分。获取、读取并标记为已读。第一种是仅从服务器获取未读电子邮件,这样做是这样的
require_once "vendor/autoload.php";
use jamesiarmes\PEWS\API\Type;
use jamesiarmes\PEWS\Mail\MailAPI;
$api = MailAPI::withUsernameAndPassword('server', 'username', 'password');
$unreadMail = $api->getUnreadMailItems();
解决方案的第二部分是read该项目。当您获取邮件项目列表时,EWS 不会返回邮件项目的正文。它认为正文是二等属性,因此您需要专门询问该邮件的信息才能获取正文。因此,为了做到这一点,我们执行以下操作
$item = $unreadMail[0];
$item = $api->getItem($item->getItemId());
$subject = $item->getSubject();
$sender = $item->getSender()->getMailbox()->getEmailAddress();
$body = (string) $item->getBody();
最后一部分是将项目标记为已读,就是这样完成的。
$api->markMailAsRead($item->getItemId());
邮件项目现在应该显示为已读。所以,如果我们把它们放在一起,结果应该是这样的
require_once "vendor/autoload.php";
use jamesiarmes\PEWS\API\Type;
use jamesiarmes\PEWS\Mail\MailAPI;
$api = MailAPI::withUsernameAndPassword('server', 'username', 'password');
$unreadMail = $api->getUnreadMailItems();
foreach ($unreadMail as $item) {
$item = $api->getItem($item->getItemId());
$subject = $item->getSubject();
$sender = $item->getSender()->getMailbox()->getEmailAddress();
$body = (string) $item->getBody();
$api->markMailAsRead($item->getItemId());
}
使用 jamesiarmes/php-ews 解决
这分为三个步骤(见上文):获取、读取和标记为已读。显然,你知道如何获取。因此,我们将跳到其中的其他两部分。
$result = $ews->FindItem($request);
foreach ($result->ResponseMessages->FindItemResponseMessage->RootFolder->Items->Message as $item) {
$request = new EWSType_GetItemType();
$request->ItemShape = new EWSType_ItemResponseShapeType();
$request->ItemShape->BaseShape = EWSType_DefaultShapeNamesType::ALL_PROPERTIES;
$request->ItemIds = new EWSType_NonEmptyArrayOfBaseItemIdsType();
$request->ItemIds->ItemId = new EWSType_ItemIdType();
$request->ItemIds->ItemId->Id = $item->ItemId->Id;
$response = $ews->GetItem($request);
//You may have to do a var_dump on the $response here. I'm only guessing that this is how you locate the message item, since I don't use this code base any more.
$item = $response->ResponseMessages->GetItemResponseMessage->Items->Message;
//You should do a var_dump on the $item to see how to get the body, subject and sender here. I'm not 100% sure how to do it on this one.
//Mark the item as read (hopefully)
$request = new EWSType_UpdateItemType();
$request->MessageDisposition = 'SaveOnly';
$request->ConflictResolution = 'AlwaysOverwrite';
$request->ItemChanges = [];
$change = new EWSType_ItemChangeType();
$change = new EWSType_ItemChangeType();
$change->ItemId = new EWSType_ItemIdType();
$change->ItemId->Id = $item->ItemId->Id;
$change->ItemId->ChangeKey = $item->ItemId->ChangeKey;
$change->Updates = new EWSType_NonEmptyArrayOfItemChangeDescriptionsType();
$change->Updates->SetItemField = array(); // Array of fields to be update
// Update Firstname (simple property)
$field = new EWSType_SetItemFieldType();
$field->FieldURI->FieldURI = 'message:IsRead';
$field->Message = new EWSType_MessageItemType();
$field->Message->IsRead = true;
$change->Updates->SetItemField[] = $field;
// Set all changes
$request->ItemChanges[] = $change;
// Send request
$response = $ews->UpdateItem($request);
echo '<pre>'.print_r($response, true).'</pre>';
}
在没有实际测试的情况下,这应该是大致的做法。您可能需要尝试一下才能使其发挥作用。你可以明白为什么我建议使用我的叉子了。