0

ウェブを何時間も検索した後、あなたは私の最後の希望です:

MicrosoftExchangeServerからの送受信メールを読み取るシステムを構築する必要があります。そのための次のスクリプトを見つけました:Exchange-Web-Services-for-PHP(Heartspring) https://github.com/Heartspring/Exchange-Web-Services-for-PHP

既存のget_messages()関数は、「受信トレイ」などのフォルダのすべてのメッセージを返します。これまでのところ、すべてが明確です。私の問題は、「送信済み」からすべてのメッセージを取得したいときに始まります-フォルダ-「送信」から「送信済みアイテム」まで、多くの単語を試しました。結果なし(メールボックスは利用できません)

私のアイデアは、フォルダ「root」のすべてのサブフォルダを取得することで、次のように記述しました。

include "init.php";

$ec = new ExchangeClient();
$ec->init("bambullis@123.de", "", NULL, "https://amxprd3610.outlook.com/EWS/Services.wsdl");

$folders = $ec->get_subfolders("root"); 

foreach($folders as $folder) {

    print_r($folder); 

}

これは私が得るものです:

stdClass Object
(
    [FolderId] => stdClass Object
        (
            [Id] => AAAeAGJhbWJ1bGxpc0BzdHVrZSbi5kZQAuAAAAAABw352p5E4yS5voYF9ELBmiAQBXYPdO6NZAQ6T9C3xviT7xAAAAC1iXAAA=
            [ChangeKey] => AQAAABYAAABXYPdO6NZAQ6T9C3xviAALNCey
        )

    [DisplayName] => Oberste Ebene des Informationsspeichers
    [TotalCount] => 0
    [ChildFolderCount] => 16
    [UnreadCount] => 0
)

(FolderId-> Idがbase64でエンコードされていることはわかっていますが、セキュリティ上の理由から上記の文字列を変更しました; o))

ここで、このディレクトリのサブフォルダを一覧表示しようとしました(メールボックスを追加して、値「ChildFolderCount」が変更されるかどうかを確認しました)。

...
print_r($folder); 

print_r($ec->get_subfolders($folder->FolderId->Id)); 
...

これは私が得るエラーです:リクエストはスキーマ検証に失敗しました:'Id'属性は無効です

私は何を間違えましたか?「ルート」からすべてのサブフォルダーを再帰的に取得するにはどうすればよいですか?私を助けることができるこの素敵な人に感謝します!

4

1 に答える 1

2

EWS-PHP のget_subfoldersメソッドは、既定でTraversalType " Shallow " を使用するため、識別されたフォルダーのみを検索し、削除されていないアイテムのフォルダー ID のみを返します。特定された親フォルダーのすべてのサブフォルダー
を検索し、削除されていないアイテムのフォルダー ID のみを返すには、「Deep」 TraversalType を使用する必要があります。 例えば:

<?php

include "init.php";

class myExchangeClient extends ExchangeClient {
    public function get_subfolders_deep($ParentFolderId = "inbox", $Distinguished = TRUE) {
        $this->setup();

        $FolderItem = new stdClass();
        $FolderItem->FolderShape = new stdClass();
        $FolderItem->ParentFolderIds = new stdClass();

        $FolderItem->FolderShape->BaseShape = "Default";
        /* 
        **  See http://msdn.microsoft.com/en-us/library/exchange/exchangewebservices.folderquerytraversaltype(v=exchg.140).aspx 
        **  Deep Traversal: Searches in all subfolders of the identified parent folder and returns only the folder IDs for items that
        **  have not been deleted.
        */
        $FolderItem->Traversal = "Deep";

        if ($Distinguished) {
          $FolderItem->ParentFolderIds->DistinguishedFolderId = new stdClass();
          $FolderItem->ParentFolderIds->DistinguishedFolderId->Id = $ParentFolderId;
        } else {
          $FolderItem->ParentFolderIds->FolderId = new stdClass();
          $FolderItem->ParentFolderIds->FolderId->Id = $ParentFolderId;
        }

        $response = $this->client->FindFolder($FolderItem);

        if ($response->ResponseMessages->FindFolderResponseMessage->ResponseCode == "NoError") {
          $folders = array();

          if (!is_array($response->ResponseMessages->FindFolderResponseMessage->RootFolder->Folders->Folder)) {
              $folders[] = $response->ResponseMessages->FindFolderResponseMessage->RootFolder->Folders->Folder;
          } else {
              $folders = $response->ResponseMessages->FindFolderResponseMessage->RootFolder->Folders->Folder;
          }

          return $folders;
        } else {
          $this->lastError = $response->ResponseMessages->FindFolderResponseMessage->ResponseCode;
        }
    }
}

$ec = new myExchangeClient();
$ec->init("bambullis@123.de", "", NULL, "https://amxprd3610.outlook.com/EWS/Services.wsdl");

$folders = $ec->get_subfolders_deep("root");
echo "<pre>".print_r($folders,true)."</pre>\n";

?>

とにかく、ExchangeClientクラスのソース コードを見ると、送信済みアイテムの FolderID は " sentitems " になっているはずです。

于 2012-09-15T19:08:45.110 に答える