Disclaimer einfügen

Als Disclaimer bezeichnet man einen Anhang an jede Mail, um z.B. die Firmenadresse oder andere Informationen mit ausgehenden Mails zu übermitteln. Beim Einsatz von Programmen wie Outlook wird dies oft als "Signatur" bezeichnet.

Links zu kommerziellen Produkten finden Sie auf MSXFAQ - Kommerzielle Disclaimer

Unterstützung durch Net at Work:
Aufgrund der aktuellen Änderung zum 01. Jan 2007 bieten wir ihnen schlüsselfertige Lösungen an.

Für Exchange 2007 funktioniert der Weg über SMTP-Sinks nicht mehr. Aber Exchange 2007 Transportrules haben die Funktion schon eingebaut. Siehe E2K7 Disclaimer. Exchange 2010 kann auch Disclaimer mit HTML und Active Directory Felder addieren.

Das Skript

Folgendes Skript sollten Sie als "disclaimer.vbs" auf dem Exchange Server an einer geeigneten Ort speichern. Da der SMTP-Server als "LocalSystem" läuft, muss das Konto "SYSTEM" Leserechte auf diese Datei haben.

<SCRIPT LANGUAGE="VBScript">

Sub ISMTPOnArrival_OnArrival(ByVal objMessage, EventStatus )
    Dim objStream
    Set objStream = objMessage.GetStream
    obhStream.Position = objStream.Size
    objStream.WriteText "-----------------------------------" & vbCrLf
    objStream.WriteText "Disclaimer Zeile 1" & vbCrLf
    objStream.WriteText "Disclaimer Zeile 2" & vbCrLf
    objStream.WriteText "Disclaimer Zeile 3" & vbCrLf
    objStream.Flush
    objMessage.DataSource.Save
    EventStatus = 0
End Sub
</SCRIPT>

In den TechNet Artikeln finden sich ausgereifter Skripte, die auch mit HTML und TEXT-Nachrichten korrekt umgehen. z.B. im folgendem TechNet Artikel:

  • 317680 How to add a disclaimer to outgoing SMTP messages in Visual Basic Script

Auch diverse kommerzielle Lösungen liefern ihnen hier natürlich weitergehende Lösungen. Verstehen Sie dieses kleine Skript eher als Technologiedemonstration.

Der SMTP-Server

Diese Skript muss auf dem Server natürlich noch registriert werden und zwar wie folgt (jeweils einer Zeile):

cscript smtpreg.vbs /add 1 OnArrival Disclaimer
CDO.SS_SMTPOnArrivalSink "mail from=*@firma.de"

cscript smtpreg.vbs /setprop 1 OnArrival Disclaimer Sink
ScriptName "c:\Temp\Disclaimer.vbs"

Die beiden Zeilen registrieren seinen SMTP-Sink, der bei der Ankunft einer Nachricht ausgeführt wird, wenn die Absenderadresse von der Firma selbst ist. Damit werden eingehende Mails von extern nicht bearbeitet.

SMTP-Server kaskadieren.

Das Skript ist ein "On Arrival"-Sink, d.h. er wird gefeuert, wenn eine Mail den SMTP-Server erreicht. Leider gibt es hier eine Designschwäche von Exchange, dass ausgehende Mails, die von MAPI-Empfängern gesendet werden, nicht auf diesem Weg verändert werden können. Das CDO-Objekt ist nur eine temporär Kopie und keine Repräsentation der Mail. Aus diesem Grund müssen Sie zwei SMTP-Server hintereinander schalten. Siehe auch:

As mentioned earlier, the CDO_OnArrival event is a wrapper around the transport OnSubmission event that provides a handle to the messages in the CDO message format. The major benefit is that the Message object interface has many useful methods, such as the parsing of MIME and RFC 822 headers. The major drawback is that the CDO interface adds significant overhead, and is synchronous. The CDO_OnArrival event is most appropriate für sinks that are run on very few messages. This is the only piece that is easily programmable using a high-level scripting language like VBScript.
Quelle: http://msdn2.microsoft.com/en-us/library/ms998608.aspx#transportevents_topic6

  • 273233 You cannot modify MAPI messages that are trapped in an SMTP transport event sink
  • 288756 SMTP Transport Event Does Not Fire für MAPI Messages
  • SMTP-EventSink
    Beschreibung, wie Sie zwei SMTP-Server hintereinander schalten.

Diese relativ umständlich Lösung ist allerdings nicht erforderlich, wenn Sie z.B.: dedizierte Connectorserver für die Übermittlung einsetzen. Dann senden ihre Mailboxserver die Nachrichten natürlich per SMTP an den Connectorserver und das Skript kann diese problemlos ändern.

Kommerzielle Lösungen können natürlich z.B.: in C++ geschrieben werden und dann den SMTP "OnPostProcessing"-Sink verwenden. Hier kann dann wirklich jede Mail verändert werden. Allerdings steht dann nicht das CDO-Message-Objekt zur Verfügung.

Weiterhin sollten Sie folgende KB-Artikel im Auge behalten, wenn Sie sehr viele Mails umschlagen:

  • 905291 The inetinfo.exe process uses lots of memory and memory usage continues to increase until the SMTP service is unresponsive in Windows Server 2003 Service Pack 1
    (Hotfix bringt Aqueue.dll Version 6.0.3790.2520)
  • 830695 Increased memory usage in the Inetinfo.exe process if delivery restrictions are set on the SMTP connector in Exchange 2000 Server (In E200 SP4 gefixt)
  • 910932 Memory usage may increase over time when a computer that is running Windows Server 2003 uses the SMTP service to process many outgoing messages
    (Hotfix bringt Aqueue.dll Version 6.0.3790.2619)

Sonstige VerbesserungsMöglichkeiten

Das Einbinden eines Disclaimers an eine ausgehende Mail mit einem SMTP-OnArrivalEventsink ist zwar einfach, wie das Beispiel auch zeigt, aber hat durchaus einige Einschränkungen. Hier ist Platz für eigene Erweiterungen oder kommerzielle Lösungen

  • Erforderliche Kaskadierung
    Die Lösung per VBScript mit CDO-Objekten funktioniert nur in Verbindung mit dem "OnArrivalSink". Damit auf diesem Wege auf einem einzelnen Server auch MAPI-Mails verarbeitet werden, muss man zwei SMTP-Server hintereinander schalten und den "OnArrival" auf dem zweiten Server nutzen. Dies kann man umgehen, in dem man z.B.: einen "OnPostProcessing"-Sink verwendet. Dazu muss man aber eine DLL einsetzen und tiefer in die Materie einsteigen, da die Mail nicht über ein CDO-Objekt angesprochen werden kann
  • Performance
    Der "OnArrival"-Sink ist nicht der schnellste, da der SMTP-Server jede Mail in ein CDO-Objekt umwandelt, auch wenn das vielleicht gar nicht benötigt wäre.
  • Firmenspezifische Signatur
    In einer Exchange Organisation gibt es oft mehrere Firmen oder eigenständige Gruppen, die natürlich eigenständige Signaturen benötigen. So könnte z.B.: über eine OU oder eine Gruppenzugehörigkeit dies gesteuert werden.
  • Personalisierung
    Eine Signatur sollte bzw. kann natürlich die Telefondurchwahl, die Faxnummer, die Mailadresse und die Adresse des Absenders enthalten. So könnte eine erweiterte Lösung diese Daten aus dem Active Directory abfragen.
  • Keine doppelten Signaturen
    Hat ein Benutzer bereits eine Signatur eingefügt, wäre das verdoppeln natürlich unschön, wenngleich auch nur der einzig sichere Weg. Leider ist es sehr schwer, eine bestehende Signatur als solche zu erkennen. Es wird also besser sein, immer die Firmensignatur anzuhängen und die Mitarbeiter zu bitten, ihre eigenen Signaturen zu entfernen oder zu reduzieren.
  • Nur externe Signaturen
    Da Exchange SMTP-Transport Event Sinks natürlich immer zuschlagen, sollte eine Lösung diese Meldung nur dann addieren, wenn die Mail wirklich nach "extern" geht. Mails innerhalb der Organisation brauchen nur dann eine Signatur, wenn der Empfänger und Absender in unterschiedlichen Firmen arbeiten. Aber selbst dann muss sichergestellt werden, dass die Signatur nur einmal addiert wird, auch wenn die Mail durch mehrere SMTP_Server geroutet wird.

Leider habe ich noch kein "fertiges Skript", welches all diese Anforderungen erfüllt. Es gibt aber einige kommerzielle Werkzeuge, die solche Lösungen bereit stellen.

Weitere Links

Kommerzielle Lösungen

Hier finden Sie einige Lösungen, die zum Teil auf dem Server und zum Teil auf einer Client Erweiterung basieren. Die Liste erhebt keinen Anspruch auf Vollständigkeit.