Я работаю над сценарием php, который подключается к серверу обмена с помощью php-ews.
Для начала я вытащил все электронные письма из своего почтового ящика и покопался, чтобы посмотреть, как работают цепные письма. Я хочу иметь возможность группировать цепочки электронной почты вместе по причинам простоты. То, что я нашел, — это 2 совершенно не связанных между собой электронных письма, которые имеют одинаковый точный идентификатор. Ключи изменений кажутся уникальными, но в цепочках электронной почты есть уникальные ключи изменений, поэтому я не могу сгруппировать их на основе этого. Любые идеи о том, как я могу получить уникальный идентификатор «цепочки электронной почты»?
Ниже приведен скрипт «из коробки»:
<?php
set_time_limit(120);
require_once('autoload.php');
require_once('credentials.php');
//$ews = new ExchangeWebServices("hostname", "username", "password", ExchangeWebServices::VERSION_2010);
$ews = new ExchangeWebServices($host, $username, $password);
$request = new EWSType_FindItemType();
$request->ItemShape = new EWSType_ItemResponseShapeType();
$request->ItemShape->BaseShape = EWSType_DefaultShapeNamesType::DEFAULT_PROPERTIES;
$request->Traversal = EWSType_ItemQueryTraversalType::SHALLOW;
// Limits the number of items retrieved
$request->IndexedPageItemView = new EWSType_IndexedPageViewType();
$request->IndexedPageItemView->BasePoint = "Beginning";
$request->IndexedPageItemView->Offset = 0; // Item number you want to start at
$request->IndexedPageItemView->MaxEntriesReturned = 1000; // Numer of items to return in total
$request->ParentFolderIds = new EWSType_NonEmptyArrayOfBaseFolderIdsType();
$request->ParentFolderIds->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType();
$request->ParentFolderIds->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::INBOX;
// sort order
$request->SortOrder = new EWSType_NonEmptyArrayOfFieldOrdersType();
$request->SortOrder->FieldOrder = array();
$order = new EWSType_FieldOrderType();
// sorts mails so that oldest appear first
// more field uri definitions can be found from types.xsd (look for UnindexedFieldURIType)
$order->FieldURI = '';
@$order->FieldURI->FieldURI = 'item:DateTimeReceived'; // @ symbol stops the creating default object from empty value error
$order->Order = 'Ascending';
$request->SortOrder->FieldOrder[] = $order;
$response = $ews->FindItem($request);
//For Debugging
//die("<pre>" . print_r($response, 1) . "</pre>");
if(!isset($response->ResponseMessages->FindItemResponseMessage->RootFolder))
{
$responseMessage = $response->ResponseMessages->FindItemResponseMessage;
die("<h3 style='text-align: center;'>Email</h3>" . $responseMessage->MessageText . "<br /><br />" . $responseMessage->ResponseCode);
}
else
$totalItems = $response->ResponseMessages->FindItemResponseMessage->RootFolder->TotalItemsInView;
$emails = array();
$rootFolder = $response->ResponseMessages->FindItemResponseMessage->RootFolder;
$messages = $rootFolder->Items->Message;
$lastItemInRange = $rootFolder->IncludesLastItemInRange;
$i = 1; // Counter to multply the max etries retrurned, to create the offset value
while($lastItemInRange != 1) // While the last item in the inbox is strill not in range retrieve the next 1000 messages
{
$limit = $request->IndexedPageItemView->MaxEntriesReturned;
$request->IndexedPageItemView->Offset = $limit * $i;
$response = $ews->FindItem($request);
$rootFolder = $response->ResponseMessages->FindItemResponseMessage->RootFolder;
$messages = array_merge($messages, $rootFolder->Items->Message);
$lastItemInRange = $rootFolder->IncludesLastItemInRange;
echo '<pre>';
print_r( $messages);
echo '</pre>';
$i++;
}
?>
И ниже приведен пример электронной почты:
[100] => stdClass Object
(
[ItemId] => stdClass Object
(
[Id] => XXXXXXXXXXXXXXXXX
[ChangeKey] => XXXXXXXXXXXXXXXXXXXX
)
[Subject] => Test Email
[Sensitivity] => Normal
[Size] => 30200
[DateTimeSent] => 2016-02-01T21:43:06Z
[DateTimeCreated] => 2016-02-01T21:43:09Z
[HasAttachments] =>
[From] => stdClass Object
(
[Mailbox] => stdClass Object
(
[Name] => Test User
[EmailAddress] => [email protected]
[RoutingType] => SMTP
)
)
[IsRead] => 1
)
Причина, по которой вы не получаете больше данных от вашего mailItem, связана с вашим request->ItemShape->BaseShape
, Вы установили свойства по умолчанию, которые не включают то, что вы хотите, conversationId
, Установка его в AllProperties вернет conversationId
как часть вашего MessageItem, который будет ItemIdType
, так что он будет иметь идентификатор и ключ изменения.
Как примечание, я бы рекомендовал не использовать эту версию php-ews. Он устарел, не поддерживается и не следует ни одному из PSR. У меня есть своя вилка, garethp/php-ews
. Вам должно быть проще работать в целом
Изменить: быстрый бит информации. ChangeKey — это только то, что вы захотите использовать для отслеживания состояния объекта. Если объект изменен, его changeKey также изменится. В основном полезно знать, устарели ли у вас данные или нет.
Других решений пока нет …