0

我在cakePHP 应用程序中使用 PHP-EWS ( https://github.com/jamesiarmes/php-ews )。目标是从交换服务器的“公共文件夹”中读取电子邮件。

问题是我只能读取公用文件夹的第一个“维度”并且找不到获取子目录的方法。

我必须读取的文件夹有 4 层深。

 $this->connect();

// start building the find folder request 
$request = new FindFolderType();
$request->Traversal = FolderQueryTraversalType::SHALLOW;
$request->FolderShape = new FolderResponseShapeType();
$request->FolderShape->BaseShape = DefaultShapeNamesType::ALL_PROPERTIES;

// configure the view
$request->IndexedPageFolderView = new IndexedPageViewType();
$request->IndexedPageFolderView->BasePoint = 'Beginning';
$request->IndexedPageFolderView->Offset = 0;

// set the starting folder
$request->ParentFolderIds = new NonEmptyArrayOfBaseFolderIdsType();
$request->ParentFolderIds->DistinguishedFolderId = new    DistinguishedFolderIdType();
$request->ParentFolderIds->DistinguishedFolderId->Id = DistinguishedFolderIdNameType::PUBLIC_FOLDERS_ROOT;

// request 
$response = $this->ews->FindFolder($request);

如果我将“遍历”更改为 DEEP,我会收到错误消息。

公用文件夹不允许进行深度遍历查询。

我也尝试过改变

$request->IndexedPageFolderView->BasePoint

对于“结束”“第二”之类的东西,它没有改变任何东西,所以我不知道它的作用以及如何使用它。

我也无法获取子目录文件夹 ID(用于更改起点),因为它从未被选中。

谢谢您的帮助。

4

1 回答 1

1

非常好的问题。不幸的是,您选择的库已过时且未维护。我个人建议你使用我更新的一个,garethp/php-ews.

我不知道这是否是最好的解决方案,但我建议的是获取第一级文件夹,然后是第二级,依此类推。所以如果你知道你的文件夹的目录结构,它看起来像这样

- Folder 1
    - Subfolder 1
        - Subfolder 2
            - Subfolder 3 (Target)
- Folder 2
- Folder 3

然后首先你会得到文件夹 1,它是DistinguishedFolderIdNameType::PUBLIC_FOLDERS_ROOT. 然后你会得到Subfolder 1which 将是 的孩子Folder 1,然后得到Subfolder 2,然后Subfolder 3。我无法建议您如何使用您当前使用的库来管理它,但对于我的它看起来像

$api = MailAPI::withUsernameAndPassword($host, $username, $password);
$folder1 = $api->getFolderByDisplayName('Folder1', Enumeration\DistinguishedFolderIdNameType::PUBLICFOLDERSROOT);
$subFolder1 = $api->getFolderByDisplayName('Subfolder1', $folder1->getFolderId());
$subFolder2 = $api->getFolderByDisplayName('Subfolder2', $subfolder1->getFolderId());
$subFolder3 = $api->getFolderByDisplayName('Subfolder3', $subfolder2->getFolderId());
$api->setFolderId($subFolder3->getFolderId());

显然这是很多调用,所以如果您经常使用该文件夹 ID,我会将 FolderID 保存到数据库中以便以后更快地检索

于 2016-06-14T08:57:01.197 回答