2016-06-14 2 views
0

Im utilisant PHP-EWS (https://github.com/jamesiarmes/php-ews) dans une application cakePHP. L'objectif est de lire les courriels d'un «dossier public» du serveur d'échange.Service Web Exchange obtenir un sous-dossier public avec PHP-EWS

Le problème est que je peux seulement lire la première "dimension" des dossiers publics et ne peux pas trouver un moyen d'obtenir les sous-répertoires. Le dossier que je dois lire est de 4 niveaux de profondeur.

$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); 

si je change "Traversal" DEEP je reçois l'erreur

requêtes DEEP traversal ne sont pas autorisés pour les dossiers publics.

J'ai aussi essayé de changer

$request->IndexedPageFolderView->BasePoint 

à des choses comme « fin » « seconde », il ne change rien donc je ne pouvais pas comprendre ce qu'il fait et comment l'utiliser.

Je ne peux pas obtenir l'ID du dossier du sous-répertoire (pour changer le point de départ), soit parce qu'il n'est jamais sélectionné.

Nous vous remercions de votre aide

Répondre

1

Très bonne question. Malheureusement, la bibliothèque que vous avez choisie est périmée et non maintenue. Personnellement, je vous suggère d'utiliser mon plus à jour, garethp/php-ews.

Je ne sais pas si c'est la meilleure solution, mais ce que je suggère est d'obtenir le dossier de premier niveau, puis le second et ainsi de suite. Donc, si vous connaissez la structure des répertoires de vos dossiers, et il semblait quelque chose comme ça

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

Alors d'abord vous obtiendrez dossier 1, ce qui serait un enfant de DistinguishedFolderIdNameType::PUBLIC_FOLDERS_ROOT. Ensuite, vous obtiendrez Subfolder 1 qui serait un enfant de Folder 1, puis obtenir Subfolder 2, puis Subfolder 3. Je ne peux pas vous conseiller sur la façon dont vous gérer cela avec la bibliothèque que vous utilisez actuellement, mais avec le mien, il ressemblerait à quelque chose comme

$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()); 

Il est évident que c'est beaucoup d'appels, donc si vous utilisez que ID de dossier souvent, je voudrais enregistrer le FolderID à une base de données pour une récupération plus rapide plus tard

+0

puis-je utiliser votre forke sans composer? – M41DZ3N

+0

Si vous écrivez un autochargeur, bien sûr. Mais je recommanderais simplement d'utiliser le compositeur –

+0

Hey Gareth, j'ai réussi à obtenir le dossier avec votre API, mais si je recherche des éléments, je rencontre une erreur sopa (objet n'a pas de propriété constante) $ api-> getMailItems ($ subFolder-> getFolderId(), array ('Restriction' => array ('contains' => 'array (' FieldURI '=> $ searchstring)))); – M41DZ3N