Also das Ganze Problem konnte ich nun lösen mit dem EWS.
Das Skript schaut nun so aus
# ===== START VARS =====
# Mailbox dessen Posteingang zu überwachen ist
$global:USERNAME = 'USERNAME'
$global:PASSWORD = 'PASSSWORD'
# Exchange-Server FQDN
$global:EXSERVER = 'EX.DOMAIN.TLD'
# ===== END VARS =====
$global:CONNECTIONTIMEOUT = 30
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}
# EWS DLL laden
Add-Type -Path "$PSScriptRoot\Microsoft.Exchange.WebServices.dll"
Get-EventSubscriber | Unregister-Event -Force
# Allen Zertifikaten vertrauen
Add-Type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
"@
# Trust all certs policy dem ServicePointManager zuweisen
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
# EWS Objekt erstellen
$global:ews = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2)
$global:ews.Url = "https://$global:EXSERVER/ews/exchange.asmx"
# Benutze die Credentials mit dem das Skript ausgeführt wird
$global:ews.UseDefaultCredentials = $false
$global:ews.Credentials = new-object System.Net.NetworkCredential($global:USERNAME,$global:PASSWORD)
$global:subscription = $global:ews.SubscribeToStreamingNotifications([Microsoft.Exchange.WebServices.Data.FolderId[]](New-Object Microsoft.Exchange.WebServices.Data.FolderId ([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)),[Microsoft.Exchange.WebServices.Data.EventType]::NewMail)
$global:connection = New-Object Microsoft.Exchange.WebServices.Data.StreamingSubscriptionConnection($global:ews,$global:CONNECTIONTIMEOUT)
# Event das beim Eintreffen einer/mehrerer neuer Mails ausgeführt wird
Register-ObjectEvent $global:connection -EventName OnNotificationEvent -SourceIdentifier NewMailNotification -Action {
write-host "NewMail subscription event received." -F Green
# Alle eingetroffenen Mails verarbeiten
$Event.SourceEventArgs.Events | %{
# Mail-Details mit übermittelter ItemId abrufen
$mail = $null
try{
[Microsoft.Exchange.WebServices.Data.EmailMessage]$mail = [Microsoft.Exchange.WebServices.Data.EmailMessage]::Bind($global:ews,$_.ItemId)
}catch{}
# Wenn die Mail gefunden wurde ...
if ($mail){
# lade Details der Mail
$mail.Load()
write-host "Replying Mail with Subject '$($mail.Subject)' to '$($mail.Sender.Address)'" -F Green
# Antwort erstellen
$mail_reply = $mail.CreateReply($false)
# benutzerdefinierte Antwort angeben
$mail_reply.BodyPrefix = 'Sehr geehrte Damen und Herren,<br/>das ist Test.<br/>Mit freundlichen Grüßen<br/>Firma XYZ'
# Antworten senden und Kopie speichern
$mail_reply.SendAndSaveCopy()
# Ursprüngliche Mail als gelesen markieren
$mail.IsRead = $true
}
}
}
# 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, restarting connection ... " -F Yellow -NoNewline
while(!$global:connection.IsOpen){
$global:connection.Open()
}
write-host "Connected." -F Green
}
# Subscription erstellen
$global:connection.AddSubscription($global:subscription)
# Subscription öffnen
$global:connection.Open()
write-host "Waiting for new events ..." -F Green
while($true){
sleep 1
}
Es geht auch wenn man es in der Powershell ausführt.
Das Skript liegt im EWS Verzeichniss auf dem Exchange Server. Wenn man diese in der Powershell startet wenn man in dem EWS verzeichniss drinnen ist geht es und beantwortet mir auch meine Mails.
Aber dazu muss immer die Powershell Konsole offen sein und der User angemeldet.
Das ist blöde weil mann muss daran denken wenn der Server mal neu gestartet wird.
Kann man das Ganze auch über die Aufgabenplanung bewerkstelligen? So das das Skript erst startet wenn alle Dienste des exchange Server gestartet sind?