Ü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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 534704
Url: https://administrator.de/contentid/534704
Ausgedruckt am: 24.11.2024 um 16:11 Uhr
3 Kommentare
Neuester Kommentar
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
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
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.
Viel Erfolg damit.
Grüße Uwe
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
}
Grüße Uwe
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen nicht vergessen. Merci.