2016-02-01 4 views
0

Я работаю над скриптом php, который подключается к серверу обмена, используя php-ews. Для начала я вытащил все письма в своем почтовом ящике и немного поработал, чтобы увидеть, как работают электронные письма. Я хочу иметь возможность группировать сети электронной почты вместе по простоте. Я обнаружил, что 2 письма полностью не связаны, у меня одинаковый точный идентификатор. ChangeKeys кажутся уникальными, но цепочки писем имеют уникальные клавиши, поэтому я не могу их объединить на основе этого. Любые идеи о том, как я могу получить уникальный идентификатор «chain email»?php-ews и идентификаторы электронной почты

Ниже приведен сценарий «из коробки»:

<?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 
     ) 

ответ

1

Причина вы не получаете больше данных из MailItem имеет делать с вашим request->ItemShape->BaseShape. У вас есть свойства по умолчанию, которые не включают то, что вы хотите, то есть conversationId. Установка его в AllProperties вернет conversationId как часть вашего MessageItem, который будет ItemIdType, поэтому он будет иметь идентификатор и changeKey.

В качестве побочного примечания я бы рекомендовал не использовать эту версию php-ews. Это устарело, не поддерживается и не соответствует ни одному из PSR. Я поддерживаю свою собственную вилку, garethp/php-ews. Вам должно быть проще работать в целом

Редактировать: Быстрая информация. ChangeKey - это только то, что вы хотите использовать для отслеживания состояния объекта. Если объект изменен, изменится и changeKey. Это в основном полезно для того, чтобы знать, устарели ли данные, которые у вас есть, или нет.

+0

Gareth, я изменил его, как вы предложили, и он не дает «talkId». Я посмотрю на свою вилку! – yusof

Смежные вопросы