Я использую PHP-EWS (https://github.com/jamesiarmes/php-ews) внутри приложения CakePHP. Цель состоит в том, чтобы читать электронные письма из «Общей папки» с сервера обмена.
Проблема в том, что я могу только прочитать первое «Измерение» общих папок и не могу найти способ получить подкаталоги.
Папка, из которой я должен прочитать, имеет 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 TRAVERSAL не разрешены для общих папок.
Я тоже пытался изменить
$request->IndexedPageFolderView->BasePoint
К таким вещам, как «конец», «второй», это ничего не изменило, поэтому я не мог понять, что он делает и как его использовать.
Я не могу получить идентификатор папки подкаталога (для изменения начальной точки), потому что он никогда не выбирается.
Спасибо за помощь.
Очень хороший вопрос К сожалению, выбранная вами библиотека устарела и не поддерживается. Я лично предложил бы вам использовать мой более современный, garethp/php-ews
.
Я не знаю, является ли это лучшим решением, но я бы посоветовал получить папку первого уровня, затем второй и так далее. Так что если вы знаете структуру каталогов ваших папок, и она выглядела примерно так
- Folder 1
- Subfolder 1
- Subfolder 2
- Subfolder 3 (Target)
- Folder 2
- Folder 3
Тогда сначала вы получите папку 1, которая будет дочерним DistinguishedFolderIdNameType::PUBLIC_FOLDERS_ROOT
, Тогда вы получите Subfolder 1
который был бы ребенком 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());
Очевидно, что это много вызовов, поэтому, если вы часто используете этот идентификатор папки, я бы сохранил FolderID в базе данных для более быстрого поиска позже
Других решений пока нет …