2016-02-15 33 views
0

我想獲取收件箱中只有未讀郵件的郵件主題和正文。如何從未讀答案打印郵件正文和主題?

  1. 我希望每次讀取一個未讀郵件並將其標記爲閱讀之後。
  2. 我需要主題,從地址郵件正文

以下代碼顯示給我所有未讀郵件的郵件ID。

require_once ('../mail3/php-ews-master/ExchangeWebServices.php'); 
require_once ('../mail3/php-ews-master/EWS_Exception.php'); 
require_once ('../mail3/php-ews-master/EWSType.php'); 
require_once ('../mail3/php-ews-master/NTLMSoapClient.php'); 

function __autoload($class_name) 
{ 
// Start from the base path and determine the location from the class name, 
$base_path = '../mail3/php-ews-master'; 
$include_file = $base_path . '/' . str_replace('_', '/', $class_name) . '.php'; 

return (file_exists($include_file) ? require_once $include_file : false); 
} 

$ews = new ExchangeWebServices("servername", "username", "password",ExchangeWebServices::VERSION_2010); 

    $request = new EWSType_FindItemType(); 
    $itemProperties = new EWSType_ItemResponseShapeType(); 
    $itemProperties->BaseShape = EWSType_DefaultShapeNamesType::ID_ONLY; 
    $itemProperties->BodyType = EWSType_BodyTypeResponseType::BEST; 
    $request->ItemShape = $itemProperties; 

    $fieldType = new EWSType_PathToUnindexedFieldType(); 
    $fieldType->FieldURI = 'message:IsRead'; 

    $constant = new EWSType_FieldURIOrConstantType(); 
    $constant->Constant = new EWSType_ConstantValueType(); 
    $constant->Constant->Value = "0"; 

    $IsEqTo = new EWSType_IsEqualToType(); 
    $IsEqTo->FieldURIOrConstant = $constant; 
    $IsEqTo->Path = $fieldType; 

    $request->Restriction = new EWSType_RestrictionType(); 
    $request->Restriction->IsEqualTo = new EWSType_IsEqualToType(); 
    $request->Restriction->IsEqualTo->FieldURI = $fieldType; 
    $request->Restriction->IsEqualTo->FieldURIOrConstant = $constant; 

    $request->IndexedPageItemView = new EWSType_IndexedPageViewType(); 
    $request->IndexedPageItemView->BasePoint = 'Beginning'; 
    $request->IndexedPageItemView->Offset = 0; 

    $request->ParentFolderIds = new EWSType_NonEmptyArrayOfBaseFolderIdsType(); 
    $request->ParentFolderIds->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType(); 
    $request->ParentFolderIds->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::INBOX; 

    $request->Traversal = EWSType_ItemQueryTraversalType::SHALLOW; 

    $result = new EWSType_FindItemResponseMessageType(); 
    $result = $ews->FindItem($request); 
    echo '<pre>'; 
    print_r($result); 

得到它後,我該如何將郵件標記爲已讀?

stdClass Object 
    (
    [ResponseMessages] => stdClass Object 
    (
    [FindItemResponseMessage] => stdClass Object 
    (
     [ResponseCode] => NoError 
     [ResponseClass] => Success 
     [RootFolder] => stdClass Object 
     (
      [Items] => stdClass Object 
      (
       [Message] => Array 
       (
        [0] => stdClass Object 
        (
         [ItemId] => stdClass Object 
         (
          [Id] => AAMkADM1NjQ4ZjU0LWI3OWYtNGZiMC1iYTgzLTU4N2E1MGMwYWNkMQBGAAAAAADANtAZyWYTTKe/pt+BZ+SXBwD+fIgCJQITS5O3LAEwY6+oAAAANbjBAAB51OTN2pqDQbTnOkGjBC0FAAGN2YkTAAA= 
          [ChangeKey] => CQAAABYAAAD+fIgCJQITS5O3LAEwY6+oAAC4WS4O 
         ) 

        ) 

        [1] => stdClass Object 
        (
         [ItemId] => stdClass Object 
         (
          [Id] => AAMkADM1NjQ4ZjU0LWI3OWYtNGZiMC1iYTgzLTU4N2E1MGMwYWNkMQBGAAAAAADANtAZyWYTTKe/pt+BZ+SXBwD+fIgCJQITS5O3LAEwY6+oAAAANbjBAAB51OTN2pqDQbTnOkGjBC0FAAGN2YkSAAA= 
          [ChangeKey] => CQAAABYAAAD+fIgCJQITS5O3LAEwY6+oAAC4WS35 
         ) 
        ) 
       ) 
      ) 
      [IndexedPagingOffset] => 2 
      [IncludesLastItemInRange] => 1 
      [TotalItemsInView] => 2 
     ) 
    ) 
    ) 
) 

回答

2

我看到你正在使用的版本jamesiarmes/php-ewsphp-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(); 

解決方案的第二部分是閱讀項目完成未讀郵件。當您獲取郵件列表時,EWS不返回郵件內容。它認爲身體是第二類財產,所以你需要專門詢問那一個郵件物品的信息來獲取身體。所以,爲了做到這一點,我們做以下

$item = $unreadMail[0]; 
$item = $api->getItem($item->getItemId()); 

$subject = $item->getSubject(); 
$sender = $item->getSender()->getMailbox()->getEmailAddress(); 
$body = (string) $item->getBody(); 

而最後一部分是mark an item as read,這是因爲這樣做。

$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>'; 
} 

沒有實際測試它,這應該大致如何你會這樣做。你可能必須玩弄它才能使它工作。你可以看到爲什麼我建議使用我的叉子。

+0

Hey Gareth, 我該如何檢查用戶是否已通過身份驗證?你有沒有任何示例代碼。 '$ api = MailAPI :: withUsernameAndPassword('xx.xx.xx。xx','xxxxxx','xxxxx');' – user2092317

+1

'withUsernameAndPassword'後,您可以嘗試一個非常簡單的請求,例如['getServerTimezones()'](https://github.com/Garethp/php-ews/ blob/master/examples/basic/getServerTimezones.php),如果沒有Authenticated,你會得到一個UnauthenicatedException –