ahstax
Goto Top

Script odgl ausführen, wenn E-Mail eingeht

Hallo,

gibt es eine Möglichkeit, einem Exchange-2010-Server beizubringen, ein Script odgl bei Eingang einer E-Mail an einen bestimmten Empfänger und mit einem definierten Betreff auszuführen?

Neugierige Grüße,
Andreas

Content-ID: 364117

Url: https://administrator.de/forum/script-odgl-ausfuehren-wenn-e-mail-eingeht-364117.html

Ausgedruckt am: 22.12.2024 um 04:12 Uhr

135333
135333 08.02.2018 aktualisiert um 16:28:46 Uhr
Goto Top
Wenn es direkt auf dem Exchange oder einem anderem System sein soll und ohne Outlook das ständig laufen muss dann machst du das mit EWS und einer Streaming Subscription auf das NewMail Event des Posteingangs der entsprechenden Mailbox:
Vorgehensweise: Stream-Benachrichtigungen bezüglich Postfach Ereignisse mithilfe von EWS in Exchange

Alternative ein Custom Transport Agent.

Gruß Snap
colinardo
Lösung colinardo 08.02.2018, aktualisiert am 06.05.2021 um 16:16:44 Uhr
Goto Top
Servus Andreas,
hier ein Beispiel wie du die von @135333 genannten EWS-Dienste mit einem Powershell-Skript nutzen kannst:
Für das Skript benötigst du die Exchange Webservices DLL (Microsoft.Exchange.WebServices.dll) welche du hier herunterladen kannst, und dann in das selbe Verzeichnis wie das Skript kopierst.

Dann sicherstellen das der User der das Skript ausführt, Impersonation Rechte am Exchange hat so das dieser jegliche Mailbox auf dem Exchange ansprechen kann ohne die jeweiligen Credentials der Ziel-Mailbox zu benötigen (Lässt sich natürlich bei Bedarf auch ändern).

Was beim Eintreffen einer Mail mit einem bestimmten Betreff passieren soll kannst du im Skript selber in Zeile 64 innerhalb des If-Checks festlegen.

Variablen im Skriptkopf natürlich anpassen.
# ===== START VARS =====
$global:MAILBOX = 'max.muster@domain.tld'  
$global:EXSERVER = 'ex.domain.tld'  
$global:SUBJECTREGEX = 'SPAM'  
# ===== 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" -EA Stop  

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)
$global:ews.Url = "https://$global:EXSERVER/ews/exchange.asmx"  
# Benutze die Credentials mit dem das Skript ausgeführt wird
$global:ews.UseDefaultCredentials = $true
$global:ews.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, [string]$global:MAILBOX)

$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 = [Microsoft.Exchange.WebServices.Data.EmailMessage]::Bind($global:ews,$_.ItemId)
        # Wenn die Mail gefunden wurde ...
        if ($mail){
            # Wenn der Betreff ein bestimmten Inhalt hat ...
            if ($mail.Subject -match $global:SUBJECTREGEX){
                write-host "New mail wich matches subject: '$($mail.Subject)'." -F Green  
            }
        }
    }
}

# 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()

cls
write-host "Waiting for new events ..." -F Green  
while($true){
    sleep 1
}
Hoffe das hilft dir.
Grüße Uwe
ahstax
ahstax 09.02.2018 um 09:12:21 Uhr
Goto Top
Hallo Snap,
hallo Uwe,

vielen Dank für die Antworten und insbesondere für den Code!
Ich werde das testen und berichten face-smile

Bis dahin ein schönes WE!
Grüße,
Andreas