Catch unknown 2007/2010

Für Exchange 2000/2003 ist der SMTP-Sink auf CatchUnknown die richtige Lösung.

Für Exchange 2003 bzw. den Windows SMTP-Server habe ich auf CatchUnknown eine Lösung beschrieben, um eingehende Mails gegen das Active Directory zu prüfen und ungültige Adressen durch ein Sammelkonto zu ersetzen. Gerade bei Migrationen ist dies oft gewünscht, um in der Anfangszeit die Mails an "vergessene Empfänger" zu sichern und nachträglich noch mal zustellen zu können.

Für Exchange 2010 ist natürlich ein Transport Agent der richtige Platz, solche E-Mails anzufangen und entsprechend umzulenken. Leider erlauben die Exchange Transport Regeln keine entsprechende Änderung, so dass ein eigener Transportagent dazu entwickelt werden muss.

Auf die Idee ist im Oktober 2007 aber schon Wilbert De Graaf gekommen, welcher auf http://catchallagent.codeplex.com einen entsprechenden Agent samt Source Code bereit gestellt hat. Auch wenn der Name "CatchAll" eigentlich vermuten lässt, dass der Agent einfach alle Mails an eine Domain in ein Postfach umleitet, so ist dem nicht so. Der Agent entspricht eher dem "CatchUnknown"-Ansatz, bei der zuerst geschaut wird, ob es den Empfänger in der Organisation gibt und erst wenn dieser nicht vorhanden ist, dann werden die Mails umgeschrieben.

Ein gültiger Empfänger bedeutet nicht, dass die Mail auch zugestellt werden. Empfangsbeschränkungen, Quotas etc. können die Zustellung dennoch verhindern. Das kann der Agent nicht erkennen.

Original Empfänger
Die getestet Version hat unter Exchange 2007 und Exchange 2010 funktioniert. Allerdings ist in der umgeleitete Mail leider nicht mehr sichtbar, an wen die Mail ursprünglich gehen sollte. Ein Stück Code, um diese Information z.B.: als zusätzliche Headerzeile einzubinden, fehlt noch. Ein Einbinden in die allgemeine "To:", "CC:", oder "BCC:"-Felder ist nicht ratsam, da dies die Mail verändern könnte, z.B.: wenn der Empfänger nur in der BCC-Liste gestanden hätte und die Mail später weiter geleitet wird.

Diese Seite beschreibt die Einrichtung des Agenten von Wilbert De Graaf in einer Exchange 2010 Umgebung. Jeder halbwegs erfahrene Administrator sollte den Agent aber auch anhand der README-Datei installieren können.

Download und und entpacken

Laden Sie sich einfach das Paket von Codeplex herunter

http://catchallagent.codeplex.com/releases/view/9982
Sie brauchen eigentlich nur die XML-Datei und die DLL.

Legen Sie dann auf dem Hub-Transport-Server ein Verzeichnis (z.B. c:\Programe\Microsoft\Exchange\V14\an und kopieren Sie die beiden Dateien dort hinein

Sammelpostfach konfigurieren

Sie möchten durch die Installation alle Mails an ungültige Empfänger an ein bestimmtes Postfach umleiten. Dieses Postfach muss es natürlich geben. Sie haben nun die Wahl, ob sie für den Zweck ein eigenes Postfach anlegen oder einem bestehenden Postfach einfach passende SMTP-Adresse geben oder später direkt eine schon vorhandene SMTP-Adressse verwenden. Da in Firman aber immer mal Umstellung en etc passieren, sollten Sie vielleicht doch einen Alias für diese Funktion überlegen wie "unzustellbar@firma.de"

Konfiguration anpassen (config.xml)

Dann müssen Sie die CONFIG.XML für ihre Domain anpassen, z.B. in der Art.

<config>
    <domain name="msxfaq.de" address="unzustellbar@msxfaq.de" />
</config>

Damit ist die eigentlich Konfiguration schon erfolgt

Agent einrichten

Nun geht es darum, den Agenten für den Exchange Transport Service auch nutzbar zu machen. Dazu muss dieser zuerst einmal installiert werden. Dies erfolgt über die PowerShell:

install-transportagent
`    -Name "CatchAll Agent" `
     -TransportAgentFactory:CatchAll.CatchAllFactory 
     -AssemblyPath:"C:\catchallagent\CatchAllAgent.dll"

Danach ist der Sing zwar schon in der Konfiguration enthalten aber noch ist er "deaktiviert". Exchange arbeitet die Agenten in einer vorgegebenen Reihenfolge ab. Wenn Sie, wie wohl viele der MSXFAQ-Server keinen EDGE-Server haben und mit "Install-AntiSpamAgents" (Siehe E2K7 Antispam) der Exchange Spamschutz installiert wurde, dann ist auch die Empfängerfilterung von Exchange aktiv.

Dann sollten Sie sich die aktuelle Reihenfolge der Agenten anschauen und dafür sorgen, dass der CatchAll-Agent vor der Empfängerfilterung eingereiht ist. Ansonsten kommt die Mail erst gar nicht zum CatchAll Agent und wird vorher schon als "unzustellbar" abgewiesen. Die Befehle dazu sind:

get-transportagent
set-transportagent "CatchAll Agent" -Priority:<nr>
get-transportagent

Nach der Änderung sollten Sie mit "get-transportagent" noch einmal prüfen, dass die Reihenfolge ihren Anforderungen entspricht. Wenn Alles soweit OK ist, dann können Sie den Agent nun aktivieren

enable-transportagent "CatchAll Agent"

Transport Rolle durchstarten

Richtig aktiv wird der Agent natürlich erst nach dem Neustart der Transport Rolle

restart-service MSExchangeTransport

Kontrollieren Sie im Eventlog bzw. über die Systemsteuerung, ob der Dienst sauber gestartet wurde

Test

Nun sollte der Exchange Server jede Mail an nicht existente Empfänger in den konfigurierten Domains zum Postfach umlenken. Wer die Funktion nicht vorab in einem Testsystem evaluiert hat, tut nun natürlich gut daran, sehr schnell die Funktion auch zu testen. Am einfachsten geht das mit einem SMTP-Client wie Outlook Express/Windows Mail oder auch per TELNET (siehe SMTP Telnet), mit dem Sie vier Fälle abtesten sollten. Ein bisschen müssen Sie aber

Richtung Beschreibung Ergebnis

Extern nach Intern

Hier muss der Agent seine normale Funktion beweisen. Eine Mail von einer externen (nicht lokalen) SMTP-Adresse an eine interne Adresse muss entweder direkt in das vorhandene Postfach zugestellt oder durch den Agent in das Sammelpostfach umgeleitet werden.

 

Intern nach Intern

Das gleiche muss auch funktionieren, wenn ein System intern an Exchange eine Mail zusendet, d.h. der Absender eine interne Adresse (durch Exchange auflösbar) ist

 

Intern nach Extern als Relay

Es gibt aber durch aus Systeme, die Mails von intern NACH extern senden, weil Sie sich z.B. als "Relay-Berechtigt" konfiguriert sind bzw. den passenden Receive Connector nutzen. Hier darf das Skript die Mail nicht anpassen, wenn der Empfänger in einer anderen Domäne ist.

 

Extern nach Extern

Ich hoffe ihre System ist KEIN offenes Relay. Aber wenn Sie Dienstleister für andere Kunden sind, kann es durchaus sein, dass ein System mit einer "nicht lokalen" Adresse eine Mail an eine andere "nicht lokale" Adresse sendet.

 

NDR an ungültig

Über den Agent sollte es eigentlich keine unerreichbaren internen Empfänger mehr geben. Aber das gilt nur für die Domains, die in der XML-Datei auch gepflegt sind. Es kann also durchaus sein, dass CatchAll nur die Domain1 bedient, Exchange aber für Domain1 und Domain2 zuständig ist. Kommt dann eine Mail von einem System (z.B. Nagios, Drucker etc.) als "ungueligeruser@Domain1.tld an falscheruser@domain2.tld an, dann erstellt Exchange weiterhin einen NDR an "ungueligeruser@Domain1.tld", der vom CatchAll umgeroutet werden sollte. Es ist gar nicht mal so ungewöhnlich, dass Webapplikationen, SQL-Server o.ä. einfach beliebige Adressen aus der eigenen Domain verwenden, die in Exchange oder Active Directory nicht vorhanden sind. Sie glauben gar nicht wie oft bei Kunden schon Adressen wie eben "nagios@firma.tld" an einen nicht mehr vorhandenen Admin gegangen sind und der NDR ebenfalls wegen "unbekannt" verworfen wurde.

 

Multi Recipient

Eine Mail muss nicht immer nur an genau einen Empfänger gehen. Es können durchaus mehrere Empfänger enthalten sein, von denen nur eine Auswahl "nicht erreichbar" sind. Hier ist dann interessant wie die Mail bei den gültigen Empfängern ankommt. Sehen Sie die Adresse des umgeschriebenen Postfachs oder bleibt dort (weil im Header und nicht im Envelope) die alte falsche Empfängeradresse sichtbar ?

 

Auswirkungen und Monitoring

Jeder zusätzliche Agent bedeutet für den Exchange Server natürlich zusätzliche Last und da der CatchAll-Sink ein quelloffenes kostenfreies Projekt ist, kann man dem Autor nicht mal böse sein, wenn das System nicht auf alle Sonderfälle getestet wurde, keine Performance Counter und Eventlogs bei Fehlern mitbringt und ein Debugging nur durch die .NET-Bordmittel (Tracing, siehe Readme) möglich ist.

Der Code ist aber sehr übersichtlich und auch für mich als Semi-Professional im Bezug auf Development durchaus verständlich. Ich sehe zumindest keine offensichtliche Löcher oder Lücken, was aber nicht heißt, dass diese nicht doch da sind. Insofern sollten Sie CPU-Ressourcen, Hauptspeicher und die Funktion von Exchange auch weiter überwachen. Sie können ja auch automatisiert immer wieder Mails an ungültige Empfänger senden und so die Funktion testen.

Weitere Links