2016-04-29 1 views
0

Informationsphp-EWS: Fatal error: Uncaught exception SoapFault: [Client] s EWS_Exception 'Classe

Je dirige ce code comme une année et tout fonctionnait bien jusqu'à hier. Voir le message d'erreur ci-dessous. Le code récupère uniquement les nombres d'e-mails non lus dans la boîte de réception. Parmi les augmentations de nombre, il jouera également un son sur le client qui exécute le code. Mon Exchange serveur est en cours d'exécution Exchange Server 2013 CU12 mais il a toujours travaillé avec ExchangeWebServices :: VERSION_2010 (voir code bolow).

Message d'erreur

Erreur fatale: Uncaught exception SoapFault: [Client] Class 'EWS_Exception' ne trouve pas dans la trace /var/www/html/php-ews/NTLMSoapClient.php:87 Stack: # 0 /var/www/html/php-ews/NTLMSoapClient.php(87): NTLMSoapClient :: __ doRequest() # 1 [fonction interne]: NTLMSoapClient-> __doRequest ('https: //mail.se ...', ' http://schemas .... '1, 0) # 2 /var/www/html/php-ews/ExchangeWebServices.php(552): SoapClient -> __ call (' FindItem », Array) # 3/var/www/html /php-ews/ExchangeWebServices.php(552): NTLMSoapClient_Exchange-> FindItem (Object (EWSType_FindItemType)) # 4 /var/www/html/mail.php(104): ExchangeWebServices-> FindItem (Object (EWSType_FindItemType)) # 5 {main} jeté dans/var/www/html/php-ew s/NTLMSoapClient.php en ligne 87

Mon code est basé sur celui qui se trouve ici: http://litphp.info/want_to_print_unread_mail_body_and_subject_using_ews_from_exchange_server_in_php

Mon code

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

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

$ews = new ExchangeWebServices("mail.server.path.com", $mailuser, $mailpass, 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->Mailbox = new StdClass; 
$request->ParentFolderIds->DistinguishedFolderId->Mailbox->EmailAddress = '[email protected]'; 
$request->ParentFolderIds->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::INBOX; 

$request->Traversal = EWSType_ItemQueryTraversalType::SHALLOW; 

$result = new EWSType_FindItemResponseMessageType(); 
$result = $ews->FindItem($request); 

if ($result->ResponseMessages->FindItemResponseMessage->ResponseCode == 'NoError' && $result->ResponseMessages->FindItemResponseMessage->ResponseClass == 'Success'){ 

    // Need this variable to check for the new value. 
    $count_new = $result->ResponseMessages->FindItemResponseMessage->RootFolder->TotalItemsInView; 

    // Play sound if value has increased. 
    if($_SESSION['count_previous'] < $count_new) { 
     echo '<script type="text/javascript">play_sound();</script>'; 
    } 

    // Saving the value for later usage. 
    $count = $result->ResponseMessages->FindItemResponseMessage->RootFolder->TotalItemsInView; 

    // Saving the current count to a session. Need it to compair with the new value ($count_new). 
    $_SESSION['count_previous'] = $count; 

    if($count > 0) { 
     echo '<script type="text/javascript">document.body.style.backgroundColor = "#fc2828";</script>'; 
     echo "<h1>" . $count . "</h1><br>"; 
     echo '<img src="img/mail.png" height="165px">'; 
    } else { 
     echo '<h1 class="paddingH12 test">No mail</h1>'; 
    } 

} 

Après un certain temps, je pensais que ce pourrait être que le code arrêté fonctionnant "comme" VERSION_2010 puisque le serveur est 2013 CU12. J'ai essayé la solution suivante mais cela n'a pas fonctionné: https://github.com/jamesiarmes/php-ews/issues/195

Est-ce que quelqu'un sait comment ce problème pourrait être résolu? C'est un peu frustrant puisque le code a fonctionné pendant un an et maintenant il ne fonctionne plus. Rien n'a été changé du côté du serveur.

Merci d'avance.

+2

Je suggère fortement vous vous éloignez de sa bibliothèque, c'est vieux et non entretenu. Je suggère d'essayer ma fourchette à http://github.com/garethp/php-ews, qui comprend un exemple simple sur la façon d'obtenir des emails non lus assez facilement –

+0

Aha, merci beaucoup mon pote. Je vérifierai. – Treps

Répondre

0

désolé pour ce poste. Cela fonctionne maintenant à nouveau. Je ne sais pas quel était le problème. Charge probablement élevée sur le serveur Exchange ou le réseau. N'hésitez pas à utiliser ce code pour obtenir uniquement les emails non lus.

Je suis aussi rafraîchissante la page après 60 secondes (sinon les sons ne fonctionne pas):

<meta http-equiv="refresh" content="60"> 

JavaScript pour le son (dans l'en-tête):

<script type="text/javascript"> 
    function play_sound() { 
     var audioElement = document.createElement('audio'); 
     audioElement.setAttribute('src', '/sound/mail.mp3'); 
     audioElement.setAttribute('autoplay', 'autoplay'); 
     audioElement.load(); 
     audioElement.play(); 
    } 
</script> 
+0

Le code fonctionne pour Exchange 2013, 2013 CU11 et 2013 CU12. Même si cela dit 2010.;) – Treps