dianaf
Goto Top

Über Änderungen in freigegebenem Kalender per Mail informieren

Hallo,

ich habe einen Kalender in Microsoft Outlook, der für verschiedene Personen freigegeben ist. Alle können Termine hinzufügen und bearbeiten. Einige der Personen möchten per E-Mail automatisch informiert werden, wenn es Änderungen in dem Kalender gibt.

Ich möchte die einzelnen Termine nicht als Besprechung mit Teilnehmern anlegen, sondern nur als Ganztagestermine von ... bis.

Gibt es da ein Makro, was im Outlook hinterlegt werden kann? Welches dann eine kurze Info versendet, wenn sich ein Termin geändert hat?

Vielen Dank für die Hilfe.

Viele Grüße

Diana F.

Content-ID: 534704

Url: https://administrator.de/forum/ueber-aenderungen-in-freigegebenem-kalender-per-mail-informieren-534704.html

Ausgedruckt am: 26.12.2024 um 01:12 Uhr

142232
142232 14.01.2020 aktualisiert um 09:18:58 Uhr
Goto Top
Makro schön und gut nur muss dafür Outlook ständig laufen. Ich würde das mit EWS und einer Streaming-Notification auf einem Server abfackeln, dann ist das unabhängig von Outlook.
https://docs.microsoft.com/de-de/exchange/client-developer/exchange-web- ...
Benutze hier mal die Suche, das hatten wir hier schon irgendwann.

Nachtrag: Gefunden
Public Folder - Kalender - Info bei Neuanlage und Änderung
colinardo
colinardo 15.01.2020, aktualisiert am 05.05.2021 um 14:20:20 Uhr
Goto Top
Servus @DianaF , willkommen auf Administrator.de!
und hier kommt die Anpassung des verlinkten Skripts für den Kalender eines freigegebenen Postfaches.
(Benötigt wird hier die EWS-DLL, welche bei nicht vorhanden sein automatisch aus dem Netz heruntergeladen und im Skriptverzeichnis entpackt wird.)
Zur Anpassung den Variablen im Kopf des Skripts entsprechende Werte wie E-Mailadresse der Mailbox und der Benutzer die Benachrichtigungen erhalten sollen, zuweisen.
<#
    EWS Kalender in Shared Mailbox mit Event-Subscription auf Änderungen überwachen und per Mail benachrichtigen
    @colinardo Administrator.de
#>

# ===== START VARS =====
# E-Mail-Adresse der Shared Mailbox
$global:SHAREDMAILBOX = 'shared@domain.tld'  
# EMAIL ADRESSEN DIE BENACHRICHTIGUNGEN ÜBER ÄNDERUNGEN ERHALTEN
$global:NOTIFICATIONMAILADDRESSES = @('user1@domain.tld','user2@domain.tld')  
# CREDENTIALS FÜR ZUGRIFF AUF SHARED MAILBOX
$cred = Get-Credential -Message "Zugangsdaten für den Zugriff auf die Shared-Mailbox angeben"  
# ===== END VARS =====

$global:CONNECTIONTIMEOUT = 30
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}    
Get-EventSubscriber | Unregister-Event -Force -EA SilentlyContinue

# Funktion zum (Herunter-)Laden des EWS Assemblies
function Load-EWSLibrary {
    $localpath = @{$true=(join-path $psscriptroot $name);$false=(join-path $env:TEMP $name)}[($psscriptroot -ne '')]  
    $tmp = '';$zip = $null  
    try{
        if(!(Test-Path $localpath)){
            Add-Type -A System.IO.Compression.FileSystem
            $tmp = "$env:TEMP\$([IO.Path]::GetRandomFileName())"  
            write-host "Downloading and extracting required 'Microsoft.Exchange.WebServices.dll' ... " -F Green -NoNewline  
            (New-Object System.Net.WebClient).DownloadFile('https://www.nuget.org/api/v2/package/Exchange.WebServices.Managed.Api', $tmp)  
            $zip = [System.IO.Compression.ZipFile]::OpenRead($tmp)
            $zip.Entries | ?{$_.Fullname -eq 'lib/net35/Microsoft.Exchange.WebServices.dll'} | %{  
                [System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$localpath)
            }
            write-host "OK" -F Green  
        }
        Add-Type -Path $localpath
    }catch{
        write-error "Error downloading required EWS Library / Error: $($_.Exception.Message)"  
    }finally{
        if ($zip){$zip.Dispose()}
        if(Test-Path $tmp){del $tmp -Force -EA SilentlyContinue}
    }
}

# EWS Library laden
Load-EWSLibrary


function global:Generate-HTMLDataTable([object]$data,[string[]]$properties){
@"  
<div>
$(
foreach($itm in $data){
    "<table class=`"modern`" style=`"float:left`">`n"  
    $properties | %{
        "<tr><th>$($_)</th><td>$($itm.$_ -replace '\r\n','<br/>')</td></tr>`n"  
    }
    "</table>`n"  
}
)
<div style="clear:both;"></div>  
</div>
"@  
}


# EWS Objekt erstellen
$global:ews = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP1)
# Exchange Service-URL per Autodiscover ermitteln
$global:ews.AutodiscoverUrl($global:SHAREDMAILBOX)
# Benutze die Credentials mit dem das Skript ausgeführt wird
$global:ews.UseDefaultCredentials = $false
$global:ews.Credentials = $cred.GetNetworkCredential()


# Inbox ID der shared mailbox ermitteln
$calID = New-Object Microsoft.Exchange.WebServices.Data.FolderId ([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar),$global:SHAREDMAILBOX
$global:calendar = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($global:ews,$calID)


# Wenn Kalender nicht gefunden wurde, beende Skript
if(!$global:calendar){
    throw "Kalender nicht gefunden!"  
    exit
}
# Streaming Subscription erstellen
$global:subscription = $global:ews.SubscribeToStreamingNotifications([Microsoft.Exchange.WebServices.Data.FolderId[]]($global:calendar.Id),[Microsoft.Exchange.WebServices.Data.EventType[]]('Created','Modified','Deleted'))  
# connection object erstellen
$global:connection = New-Object Microsoft.Exchange.WebServices.Data.StreamingSubscriptionConnection($global:ews,$global:CONNECTIONTIMEOUT)


# Event das beim Erstellen/Ändern einer/mehrerer neuer Appointments/Meetings ausgeführt wird
Register-ObjectEvent $global:connection -EventName OnNotificationEvent -SourceIdentifier NewCalendarEvent -Action {
    # Alle Events verarbeiten
    $Event.SourceEventArgs.Events | ?{$_.ItemId -ne $null} | %{
        # Item-Details abrufen
        $item = $null
        try{
            $item = [Microsoft.Exchange.WebServices.Data.Item]::Bind($global:ews, $_.ItemId)
        }catch{}
        # wenn item existiert
        if($item -ne $null){
            # Log auf die Konsole
            write-host "Event-Typ: $($_.EventType)" -F Green  
            write-host ($item | fl Subject,DateTimeCreated,Start,End,Location,IsAllDayEvent,Duration | out-string)
            # Erstelle Benachrichtigungs-Mail
            $mail = New-Object Microsoft.Exchange.WebServices.Data.EmailMessage $global:ews
            $mail.Subject = "Im Kalender '$($global:calendar.DisplayName)' der Mailbox '$global:SHAREDMAILBOX' wurde eine Änderung festgestellt."  
            $mail.Body =@"  
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
</head>
<body>
<style>
h1,h2,h3,h4,h5,h6 {
    clear:both;
}
body {
    font-family: Verdana, Arial, Helvetica, sans-serif;
    font-size:0.9em;
}
table.modern {
	font-family: Verdana, Arial, Helvetica, sans-serif;
	border-collapse: collapse;
	border-left: 1px solid #ccc;
	border-top: 1px solid #ccc;
	color: #333;
    margin:5px;
}
table.modern tr th {
    font-weight: bold;
	text-align:left;
}
table.modern tfoot tr th, table.modern tfoot tr td {
	text-transform: uppercase;
	color: #000;
	font-weight: bold;
}
table.modern td, table.modern th {
	border-right: 1px solid #ccc;
	border-bottom: 1px solid #ccc;
	padding: 5px;
	line-height: 1.8em;
	font-size: 0.8em;
	vertical-align: top;
}
table.modern tr:nth-child(even) td,table.modern tr:nth-child(even) th { background: #efefef; }
</style>
<h3>Änderungstyp: $($_.EventType)</h3>
$(Generate-HTMLDataTable $item Subject,DateTimeCreated,Start,End,Location,IsAllDayEvent,Duration)
</body>
</html>
"@  
            # füge Empfänger hinzu
            $global:NOTIFICATIONMAILADDRESSES | %{
                $mail.ToRecipients.Add($_)
            }
            # Sende Mail
            $mail.Send()

        }elseif ($_.EventType -in @('Deleted')){  
            # Log auf die Konsole
            write-host "Event-Typ: $($_.EventType)" -F Green  
            write-host ($_ | fl * | out-string)
            # Erstelle Benachrichtigungs-Mail
            $mail = New-Object Microsoft.Exchange.WebServices.Data.EmailMessage $global:ews
            $mail.Subject = "Im Kalender '$($global:calendar.DisplayName)' der Mailbox '$global:SHAREDMAILBOX' wurde eine Änderung festgestellt."  
            $mail.Body = @"  
            <h3>Event-Typ: $($_.EventType)</h3>
            Das Item mit der ID '$($_.ItemId)' wurden entweder gelöscht oder verschoben.  
"@  
            # füge Empfänger hinzu
            $global:NOTIFICATIONMAILADDRESSES | %{
                $mail.ToRecipients.Add($_)
            }
            # Sende Mail
            $mail.Send()
        }

    }
} | out-null



# Event das beim Disconnect der Verbindung ausgeführt wird (Verbindung wird dann erneut hier wiederhergestellt)
Register-ObjectEvent $global:connection -EventName OnDisconnect -SourceIdentifier OnDisconnectNotification -Action {
    write-host "Subscription-Connection disconnected, trying to reconnect ... " -F Yellow -NoNewline  
    while(!$global:connection.IsOpen){
        write-host '.' -NoNewline -F Yellow  
        $global:connection.Open()
        sleep -Milliseconds 500
    }
    write-host "Connected." -F Green  
} | out-null


# Subscription anlegen
$global:connection.AddSubscription($global:subscription)
# Subscription öffnen
$global:connection.Open()

cls
write-host "Warte auf Änderungen im Kalender ... (ESC drücken zum beenden)" -F Green  

while ($true){
    if ($host.name -eq 'consolehost'){  
        if([Console]::KeyAvailable -and [Console]::ReadKey().Key -eq [ConsoleKey]::Escape){
            Get-EventSubscriber | Unregister-Event -Force -EA SilentlyContinue
            $global:connection.Close()
            break
        }
    }
    sleep 1
}
Viel Erfolg damit.
Grüße Uwe
colinardo
colinardo 20.01.2020 aktualisiert um 16:53:56 Uhr
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen nicht vergessen. Merci.