Exchange 2010/2013: Postfach auf ungelesene Nachrichten überwachen (EWS)

Dieses kleine Script überwacht des Posteingang eines Postfachs auf ungelesene Nachrichten. Ich habe es erstellt um Dienstpostfächer zu überwachen, aus denen andere Programme automatisch Mails verarbeiten. Mit ein paar kleinen Anpassungen lässt sich daraus auch ein Monitor für PRTG oder Solarwinds erstellen.

#————————————————————————————–
# Postfach auf ungelesene Mails prüfen
# www.frankysweb.de
#
# by Frank Zöchling
# Version 0.1
#
#————————————————————————————–

$mailboxName = „journal@frankysweb.de“ #zu überprüfende Mailbox
$maxUnreadAge = „20“ #Wert in Minuten (1 Tag = 1440 Minuten)

#EWS Verbindung herstellen

Add-Type -Path „C:\Program Files\Microsoft\Exchange\Web Services\2.0\Microsoft.Exchange.WebServices.dll“
$version = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2
$service = new-object Microsoft.Exchange.WebServices.Data.ExchangeService($version)
$service.UseDefaultCredentials = $true
$service.AutodiscoverUrl($mailboxName)

$inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)

#Mails abrufen und auswerten

$today = get-date
$maxagetime = $today.AddMinutes(-$maxUnreadAge)

$mails = $inbox.FindItems(100)

$unreadmails = $mails | where {$_.isRead -match „False“}
$unreadmailscount = $unreadmails | measure-object | foreach-object {$_.Count}
$unreadmailsmaxagecount = $unreadmails | where {$_.DateTimeReceived -lt $maxagetime} | measure-object | foreach-object {$_.Count}

write-host „Anzahl ungelesene E-Mails: $unreadmailscount“
write-host „Anzahl ungelesene E-Mails älter als $maxUnreadAge Minuten: $unreadmailsmaxagecount“

Um das Script aufzuführen ist die EWS API 2.0 erforderlich, die API kann hier runtergeladen werden:

http://www.microsoft.com/en-us/download/details.aspx?id=35371

5 thoughts on “Exchange 2010/2013: Postfach auf ungelesene Nachrichten überwachen (EWS)”

  1. Hallo Frank

    Dein Script interessiert mich sehr da ich auch ein Postfach mit PRTG überwachen möchte.
    Leider erhalte ich immer die selbe Anzahl ungelesener Mails.
    ungelesen: 99
    ungelesen älter als 20 minuten: 99
    Kannst Du mir sagen wo da der Fehler liegt?

    Danke im Voraus
    Rolf

    Reply
  2. Hallo Frank!

    Exchange 2016 Umgebung EWS 2.2 ist eingerichet.
    EWS habe ich getestet und funktioniert.

    Bei dem Aufruf

    $inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)

    bekomme ich immer die Meldung

    Ausnahme beim Aufrufen von „Bind“ mit 2 Argument(en): „Es ist kein Postfach mit einer solchen GUID vorhanden.“
    In D:\Script\Mailchecker.ps1:19 Zeichen:5
    + $inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($serv …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ServiceResponseException

    Wäre da nach schlau.

    Derzeit schaut das Script so aus:

    $mailboxName = „dispatch@contoso.eu“ #zu überprüfende Mailbox
    $maxUnreadAge = „20“ #Wert in Minuten (1 Tag = 1440 Minuten)

    #EWS Verbindung herstellen
    #Derzeit ist EWS Api2.2 Installiert

    Add-Type -Path „C:\Program Files\Microsoft\Exchange\Web Services\2.2 \Microsoft.Exchange.WebServices.dll“

    $version = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2016

    $service = new-object Microsoft.Exchange.WebServices.Data.ExchangeService($version)
    $service.UseDefaultCredentials = $true
    $service.AutodiscoverUrl($mailboxName)

    $inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)

    #Mails abrufen und auswerten

    $today = get-date
    $maxagetime = $today.AddMinutes(-$maxUnreadAge)

    $mails = $inbox.FindItems(100)

    $unreadmails = $mails | where {$_.isRead -match „False“}
    $unreadmailscount = $unreadmails | measure-object | foreach-object {$_.Count}
    $unreadmailsmaxagecount = $unreadmails | where {$_.DateTimeReceived -lt $maxagetime} | measure-object | foreach-object {$_.Count}

    write-host Anzahl ungelesene E-Mails: $unreadmailscount
    write-host Anzahl ungelesene E-Mails älter als $maxUnreadAge Minuten: $unreadmailsmaxagecountâ

    Reply
  3. Hallo Frank,

    ich habe folgende Anforderung (Exchange 2013):
    1. Emails in einem Unterordner alter als X Minuten vorhanden sind
    2. Eine bestimmte Anzahl von Mails in einem Unterordner überschritten wurde

    Die erste Anforderung würde dein Script ja erfüllen, kannst Du es bitte für die 2. Anforderung anpassen.

    Danke & Gruß
    Eugen

    Reply
  4. Hallo Frank,
    ich bin hier auf dein Script gestossen, sieht sehr intressant aus. Nur meine Frage dazu:
    Läuft das auch auf Exchange 2016?

    Gruß
    Heiko

    Reply

Leave a Comment