CatchAll

Eine Lösung um nicht alle Adressen einer Domäne sondern nur unbekannte Adressen in ein Sammelpostfach zu werfen finden Sie auf Sink:CatchUnknown

Aufgrund der veränderten Struktur von Exchange 2007 kann der hier beschriebene SMTP-Eventsink nicht mit Exchange 2007 eingesetzt werden. Diese Funktion sollte aber durch einen Transportrule erzielt werden können. Allerdings müssen Sie aber auch hier Exchange 2007 so einstellen, dass er erst mal jede Adresse (auch ungültige) annimmt.
How to write Exchange 2007 transport agents http://blogs.technet.com/b/exchange/archive/2006/12/04/431755.aspx

Ein Microsoft Entwickler hat einen Mustersink erstellt und auf Codeplex veröffentlicht:
http://catchallagent.codeplex.com/
http://www.petri.co.il/setting-up-a-catchall-mailbox-in-exchange-2007.htm

Per Transportregeln geht es aber auch
How to Configure a Catch-All Mailbox http://technet.microsoft.com/en-us/library/bb691132(EXCHG.80).aspx
Oder per Transport Agent: Catchall Agent auf Codeplex http://catchallagent.codeplex.com

Exchange kennt seine Benutzer und Postfächer und liest dazu die Adressen aus dem  Active Directory aus. Von Hause aus gibt es innerhalb einer Exchange Organisation aber kein Sammelpostfach. Folgende Gründe könnten ein Sammelpostfach aber wünschenswert werden lassen.

  • Keine unzustellbaren Mails
    Durch ein Sammelkonto wird keine Mail mehr als "unzustellbar" abgewiesen oder quittiert. Dies kann für eine Firma wichtig sein, da nur so auch Mail an falsch geschriebene Empfänger angenommen und notfalls von Hand weiter geleitet werden können. Allerdings muss dann immer sichergestellt sein, dass das Sammelpostfach wirklich überwacht wird. Leider stellt sich so ein Sammelpostfach in der heutigen Zeit als reine Sammelstelle für Spam und Virenmails dar, da eben diese Absender blind adressieren. Wundern Sie sich daher nicht, wenn in solche einem Sammelkonto nur wenige "gute" Nachrichten landen.
  • Sammelkonto für Providerbetrieb
    Ein anderer Einsatzzweck ist der Betrieb von Exchange als Internet Provider mit POP3-Sammelkonten. Immer noch gibt es viele Firmen, die ihre Mails nicht per SMTP zugestellt bekommen, sondern per POP3 diese bei einem Provider abholen. Auch wenn dies immer wieder mit Problemen verbunden ist. Wenn Sie nun als Provider selbst "Exchange" als Mailserver betreiben, dann möchten Sie vielleicht ein Postfach anlegen, in dem alle Mails für eine Domäne landen. Auch hierfür ist eine "Catchall" Mailbox für die gesamte Domäne erforderlich.
  • Aktionsadressen und Robots
    Sehr viele Firmen nutzen neben dem richtigen Mailadressen für den Versand von Nachrichten oder Werbeaktionen individualisierte einmalige Mailadressen. Da eine Rückantwort möglich sein sollte, müssten Sie in Exchange nun all diese Adressen anlegen. Ein Sammelaccount wäre auch hier der optimale Platz, diese Einmaladressen zu empfangen. Eine Drittsoftware könnte dann automatisch dieses Postfach öffnen und die Nachrichten an solche Einmaladressen heraus fischen und verarbeiten. So arbeiten z.B.: einige Newsletter um unzustellbarkeiten beim Versand automatisch zuordnen zu können.
  • Spamfalle
    Gerade weil sehr viele Spammer und Viren sich an zufällige Mailadressen versenden, kann solch ein Sammelpostfach auch als Quelle für das Training eines Spamfilters dienen. Besser finde ich hier aber dann doch explizit definierte Mailadressen (Honeypots), da in dem Sammelfilter sich auch die ein oder andere "gute" Mail aufgrund falscher Schreibweise landet.

Auch wenn CatchAll möglich und interessant erscheint, so vertrete ich die Meinung, dass ein Mailsystem unzustellbare Nachrichten gar nicht erst annehmen sollte, sondern direkt beim SMTP-Handshake den Empfang ablehnen sollte. Dies spart Transfervolumen, der Anwender bekommt eine unzustellbarkeitsmeldung und Spammer und Viren können ihren Schadanteil gar nicht erst senden.

Es gibt mehrere Wege eine Lösung mit einem Sammelpostfach zu schaffen. Aber es gibt natürlich auch Irrwege, die ich kurz aufzeigen will. Vielleicht haben Sie schon das ein oder andere versucht und sind erst dann hier gelandet. Alle drei Irrwege sollten Sie umgehend rückgängig machen:

Irrweg 1: *@firma.de

Es ist nicht möglich, einem Postfach, Verteiler oder öffentlichen Ordner eine Mailadresse in der Form "*@firma.de" zu geben.

Sie können dies zwar tatsächlich eintragen, aber Exchange macht kein Routing mit Platzhaltern.

Irrweg2: virtueller SMTP-Server

Sie können bei Exchange 2003 bzw. Windows 2003 im virtuellen SMTP-Server einen Host angeben, an den nicht zustellbare Mails weiter geleitet werden. Eine solche "Überlauffunktion" ist direkt auf dem SMTP-Server möglich oder innerhalb von Exchange selbst, durch nicht autoritative Empfängerrichtlinien.

Sie benötigen dazu aber immer einen weiteren SMTP-Server, z.B.: auf Basis von Windows oder Unix; welcher dann die Mails annimmt und in seine eigenen Postfächer zustellt oder umschreibt und an Exchange sendet.

Irrweg 3: virtuelle SMTP-Server NDR-Adresse

Viele nutzen die Funktion, eine Kopie der unzustellbarkeitsmeldung an ein Postfach zu senden. Dies bedeutet aber, dass der Absender tatsächlich eine unzustellbarkeit erhalten hat. Sie als Administrator erhalten diese nur als Kopie und können dann reagieren. Sie könnten z.B.: dem Absender die korrekte Mailadresse mitteilen.

Das Problem vieler ungültig adressierter Mails durch Spam, Würmer und Viren wird sie aber sehr bald davon abbringen, diese Funktion zu aktivieren.

Lösung: EventSink für komplette Domain

Der einzig gangbare Weg ist ein System, welches vor der Namensauflösung von Exchange schon prüft, ob die Zieladresse erreichbar ist und wenn dies nicht der Fall ist, diese eben verändert. Dies ist genau die Aufgabe, die entweder ein vor Exchange geschaltetes Programm oder eben ein Exchange Transport Event Sink (siehe Exchange 2000/2003 Event Sinks) auf dem ersten Exchange Server der Organisation ausfüllt. Dass so ein Eventsink gar nicht schwer ist, zeigt folgender Code Schnipsel aus der TechNet (Aus Q324021 How to create a "catchall" mailbox sink für Exchange 2000)

Das Script besteht aus zwei Funktionen. Exchange ruft für jede empfangene Mail die Funktion "ISMTPOnArrival_OnArrival" an, welche eine Kopie (ByVal) der Mitteilung als Objekt übergibt und einen "EventStatus" am Ende zurück erwartet.

Dies Routine holt sich nun mit "msg.envelopeFields" die Informationen aus dem SMTP-Envelope. Zur Erinnerung: Der Envelope ist NICHT Bestandteil des Headers, sondern nur für den Mailserver von belang und enthält die Werte aus den SMTP-Befehlen "MAIL FROM" und "RCPT TO" (Siehe auch SMTP-Telnet). Interessant sind hiervon nur die Empfänger (RECIP_LIST) welche an die Funktion "FixupRecipList" übergeben und von dort verändert wieder zurück gegeben und geändert und gespeichert werden.

<SCRIPT LANGUAGE="VBSCRIPT">
'
' für information about this namespace, see
'   http://msdn.Microsoft.com/library/default.asp?
' URL=/library/en-us/cdosys/html/_cdosys_schema_smtpenvelope.asp
'
Const RECIP_LIST = "http://schemas.Microsoft.com/cdo/smtpenvelope/recipientlist"
'
' für information about the CdoEventStatus enumeration, see
'   http://msdn.Microsoft.com/library/default.asp?
' URL=/library/en-us/cdosys/html/_cdosys_cdoeventstatus_enum.asp
'
Const CDO_RUN_NEXT_SINK = 0
'
' OnArrival sink entry point
'
Sub ISMTPOnArrival_OnArrival(ByVal Msg, EventStatus)
  On Error Resume Next
  Dim objFields
  Set objFields = Msg.EnvelopeFields
  objFields(RECIP_LIST).Value = FixupRecipList(objFields(RECIP_LIST).Value)
  objFields.Update
  Msg.DataSource.Save ' Commit changes
  EventStatus = CDO_RUN_NEXT_SINK
End Sub
'
'  Change any @example.com recipient(s) to bob@company.com
'
Function FixupRecipList(strList)
  On Error Resume Next
  Dim strFixedList
  Dim nDomainPart
  Dim nNamePart
  Dim nNextAddress
  strFixedList = strList
  While (InStr(LCase(strFixedList),"@example.com"))
    nDomainPart = InStr(LCase(strFixedList),"@example.com")
    nNamePart = InStrRev(strFixedList,";",nDomainPart)
    nNextAddress = InStr(nDomainPart+Len("@example.com;"),strFixedList,"SMTP:")
    If (0 = nNamePart) Then
      ' @example.com is first name in recipient list
      If (0 = nNextAddress) Then
        ' @example.com is the last name in the recipient list
        strFixedList = "SMTP:bob@company.com;"
      Else
        ' @example.com is not the last name in the recipient list
        strFixedList = "SMTP:bob@company.com;" & _
                        Right(strFixedList,Len(strFixedList)-nNextAddress+1)
      End If
    Else
      ' @example.com is not the first name in recipient list
      If (0 = nNextAddress) Then
        ' @example.com is the last name in the recipient list
        strFixedList = Left(strFixedList,nNamePart) & "SMTP:bob@company.com;"
      Else
        ' @example.com is not the last name in the recipient list
        strFixedList = Left(strFixedList,nNamePart) & "SMTP:bob@company.com;" & _
                       Right(strFixedList,Len(strFixedList)-nNextAddress+1)
      End If
    End If
  Wend
  FixupRecipList = strFixedList
End Function

</SCRIPT>

Die Funktion "FixipRecipList" übernimmt nun den Part, alle Empfänger an "example.com" durch "bob@company.com" zu ersetzen. Mindestens diese Stellen müssen Sie daher anpassen.

Diese Funktion ist ein klassischer "CatchAll" Account, der alle Mails an diese Domäne in ein Postfach umleitet und eignet sich daher in der Form nur für einen Provider, der alle Mails einer Domain in ein Postfach legen will.

Für die meisten Firmen ist jedoch eine Anpassung erforderlich, bei der die Empfängerliste z.B. gegen das Active Directory geprüft wird und z.B.: nur ungültige Empfänger einer Domäne umgeleitet werden. Dies leistet dieses Script nicht. Die Funktion eines SMTP Transport Event Sink und dieses Scripts sollte aber hinreichend erklärt sein. Unter den Links finden Sie weitere SMTP-EventSinks, die in anderen Programmiersprachen geschrieben sind.

Weitere Links