2017-05-24 2 views
1

Je suis nouveau avec PowerShell et travaille actuellement sur un script pour vérifier si une boîte aux lettres partagée contient du courrier non lu. J'essaie actuellement de récupérer mes mails avec la méthode FindItems(). Voici mon code:Vérification du nombre de mails d'échange non lus avec EWS

[int]$nb_unread = 0 
[string]$email = "[email protected]" 
[string]$Msg = "" 
[int]$Code = 0 
[string]$err = "" 
Try 
{ 

    Add-Type -Path "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll" 
    $ews = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013) 

    $ews.Credentials = New-Object Net.NetworkCredential('user', 'password') 
    $ews.AutodiscoverUrl($email, {$true}) 
    $inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($ews,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox) 
    $view = new-object Microsoft.Exchange.WebServices.Data.ItemView(10) 
    $mailItems = $inbox.FindItems($view) 
    $mails | ForEach {$_.Load()} 

    foreach($mail in $mails) 
    { 
     if($mail.isread -eq $false) 
     { 
      nb_unread += 1 
     } 
    } 
    if (nb_unread -eq 0) 
    { 
     $Msg = "OK;No unread mail." 
    } 
    else 
    { 
     $Msg = ("NOOK;Unread mails : " -f $nb_unread) 
    } 
} 
Catch 
{ 
    $Code = 2 
    $Msg = ("CRITICAL: erreur(s) d'execution du script : {0}" -f $err) 
} 

J'ai eu cette erreur lorsque mes scripts exécutent la ligne '$ MailItems = $ inbox.FindItems ($ view).

Exception lors de l'appel de «FindItems» avec «1» argument(s): «The request failed. Le serveur distant a retourné une 
erreur: (501) Non implémenté.» 
Au caractère Ligne:16 : 5 
+  $mailItems = $inbox.FindItems($view) 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : ServiceRequestException 

traduction

Exception when calling "FindItems" with "1" argument (s): "The request failed. The remote server returned an error: (501) Not implemented. 
At Line:16 Char:5 
+ $ mailItems = $inbox.FindItems ($ view) 
+ ~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo: NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId: ServiceRequestException 
+0

Et votre problème est quoi exactement? Comment ce code ne fonctionne-t-il pas? Vous avez un énorme bloc try et aucun bloc catch qui devrait déclencher une erreur de syntaxe. Le code est-il en train d'errer silencieusement à partir d'une capture vide? – Matt

+0

Eh bien, mon script se bloque quand il exécute le FindItem. Mon message est mis à jour avec l'erreur. – Aurelien

Répondre

2

rugueux Anglais A related question in C# commence sur le même pied que vous. Vous n'avez pas besoin d'interroger tous les messages de la boîte pour voir s'ils ne sont pas lus. Il est une propriété de dossier de données qui a déjà cette information pour vous: UnreadCount

# Get the Mailbox ID of the Inbox folder. 
$inboxFolderID = [Microsoft.Exchange.WebServices.Data.FolderId]::new([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox,$MailAddress) 

# Bind to the inbox folder. 
$boundFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($objExchange,$inboxFolderID) 
$boundFolder.UnreadCount 

Dans votre cas, vous devriez juste avoir à utiliser $inbox.UnreadCount et de supprimer votre logique de boucle.

+0

Merci, l'appel $ inbox.UnreadCount fait ce dont j'ai besoin dans mon script. – Aurelien

0

je vais par un autre aproche:

$inbox_mails = $Inbox.FindItems($Inbox.TotalCount) 
$inbox_mails | where-object IsRead -eq $false 

Et puis tuyau qui soit dans la table de format ou de l'envelopper dans ().count ou faire quelque chose d'autre avec elle.

Comme:

($inbox_mails | where-object IsRead -eq $false).count 

aussi, où est votre variable $sfCollection vient?

+0

C'est une très mauvaise approche. Vous demandez essentiellement tous les mails dans le dossier actuel. Nice pour les petites boîtes aux lettres. Un désastre pour une boîte aux lettres contenant des milliers d'éléments. – bluuf

+0

Oui, je sais maintenant, ce n'est que lorsque j'ai vu l'autre réponse que j'ai pris connaissance de la propriété UnreadCount. – Adamar