Exchange 2010/2013: Monitor mailbox for unread messages (EWS)

This little script monitors the inbox of a mailbox for unread messages. I created it to monitor service mailboxes from which other programs automatically process mails. With a few small adjustments, it can also be used to create a monitor for PRTG or Solarwinds.

#-----------------------------
# Check mailbox for unread mails
# www.frankysweb.de
#
# by Frank Zöchling
# Version 0.1
#
#-----------------------------

$mailboxName = "journal@frankysweb.de" #mailbox to be checked
$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 "Number of unread emails: $unreadmailscount"
write-host "Number of unread emails older than $maxUnreadAge minutes: $unreadmailsmaxagecount"

To run the script the EWS API 2.0 is required, the API can be downloaded here:

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