Seit Exchange 2007 gibt es die Möglichkeit, auf dem Hub-Transportserver Regeln einzurichten. (Ähnlich wie in Outlook)
Leider hat Microsoft die maximale Größe für den Regelspeicher auf 8k beschränkt. Viele Regeln passen da nicht rein, insbesondere wenn die Regeln viel Inhalt (Mailadressen oder Wörter) enthalten.
Als Lösung/Workaround wird deshalb ein Transport Agent vorgeschlagen.
Hier eine Lösung für einen RoutingAgent, der Mailverteiler nur im BCC Feld zulässt. Sollte ein Mailverteiler in To oder CC verwendet werden, wird die Nachricht zurückgeschickt. Die Gruppen werden anhand des Active Directory Attributes “msExchRequireAuthToSendTo” gefiltert, welches auf TRUE stehen muss.
Beispiel (Class Library):
Bitte die folgenden Dateien zum Projekt hinzufügen (C:\Program Files\Microsoft\Exchange Server\Public) und dann darauf referenzieren:
- Microsoft.Exchange.Data.Common.dll
- Microsoft.Exchange.Data.Common.xml
- Microsoft.Exchange.Data.Transport.dll
- Microsoft.Exchange.Data.Transport.xml
Imports System Imports System.Collections.Generic Imports System.Text Imports System.Diagnostics Imports Microsoft.Exchange.Data.Transport Imports Microsoft.Exchange.Data.Transport.Email Imports Microsoft.Exchange.Data.Transport.Smtp Imports Microsoft.Exchange.Data.Transport.Routing Imports Microsoft.Exchange.Data.Common Imports Microsoft.Exchange.Data.Mime Imports Microsoft.Exchange.Data.ContentTypes.Tnef Imports System.DirectoryServicesNamespace DYNASYSAgentsNotInheritable Class DYNASYSBCCRAFactory Inherits RoutingAgentFactory Public Overrides Function CreateAgent(ByVal server As SmtpServer) As RoutingAgent Return New MyDYNASYSBCCRoutingAgent End Function End ClassPublic Class MyDYNASYSBCCRoutingAgent Inherits RoutingAgentPrivate Sub MySubmittedMessage(ByVal source As SubmittedMessageEventSource,_ ByVal e As QueuedMessageEventArgs) Handles Me.OnSubmittedMessage Try Dim cNachricht As String =_ "Bitte verwenden Sie die Mailverteiler nur im BCC: Feld." & vbCrLf '*** TRUE: Nur monitoren und als Kopie ins Exchangepostfach,'*** False: Prozess ist enabled und die Mails werden aktiv geblockt!!!Dim lMonitorOnly As Boolean = True Dim xSMTPs As New ArrayList Dim cExchangeMeldungenSMTP As String ="@DYNASYS.de" '*** immer eine Kopie an das Teampostfach '*** eine Mailadresse einer Gruppe (immer nur 1 Eintrag) Dim xGroupSMTP As String Dim lFound As Boolean = FalseDim xToRecipient As Microsoft.Exchange.Data.Transport.Email.EmailRecipientCollection Dim xCCRecipient As Microsoft.Exchange.Data.Transport.Email.EmailRecipientCollection Dim xRecipient As Microsoft.Exchange.Data.Transport.Email.EmailRecipient Dim normalRejectResponse As New Microsoft.Exchange.Data.Transport.Smtp.SmtpResponse ("500", "", "your message has been rejected") Dim cMyBody As Email.Body'*** '*** ist der Sender aus der DYNASYS? Dann die To und CC Empfänger prüfen '*** If e.MailItem.Message.Sender.SmtpAddress.ToUpper.IndexOf("@DYNASYS.DE") > 0 Or e.MailItem.Message.Sender.SmtpAddress.ToUpper.IndexOf("@DYNASYS.AT") > 0 Or e.MailItem.Message.Sender.SmtpAddress.ToUpper.IndexOf("DYNASYS-GROUP.COM") > 0 ThenxSMTPs = GetSMTPAddresses() '*** Hole alle Mailadressen für die Blacklist'*** '*** Hole alle Mailempfänger aus To und CC '*** xToRecipient = e.MailItem.Message.To xCCRecipient = e.MailItem.Message.CclFound = False '*** Flag für Überprüfung'*** '*** Alle im To Feld '*** For Each xRecipient In xToRecipient '** Alle TO: For Each xGroupSMTP In xSMTPs If xRecipient.SmtpAddress.ToUpper = xGroupSMTP.ToUpper Then lFound = True '*** ein Treffer ist ausreichend um die Mail zu blockieren Exit For End If Next Next '*** '*** Alle im CC Feld. '*** Ist aber nur nötig, wenn im To Feld noch nichts gefunden wurde. '*** ansonsten würde die Mail ja eh schon blockiert werden '*** If Not lFound Then For Each xRecipient In xCCRecipient '*** Alle CC: For Each xGroupSMTP In xSMTPs If xRecipient.SmtpAddress.ToUpper = xGroupSMTP.ToUpper Then lFound = True '*** ein Treffer ist ausreichend um die Mail zu blockieren Exit For End If Next Next End IfIf lFound Then '*** Diese Mail darf nicht gesendet werden, weil in To oder CC eine Gruppe verwendet wird.... If Not lMonitorOnly Then '*** Achtung: geht nur, wenn der Monitorbetrieb ausgeschalten ist lMonitorOnly=FALSE '*** Alle Empfänger entfernene.MailItem.Recipients.Clear() '*** Sender als Empfänger einsetzen e.MailItem.Recipients.Add(e.MailItem.Message.Sender.SmtpAddress) '*** Betreff ergänzen um Hinweistext e.MailItem.Message.Subject = "[Exchange Server: Ihre Nachricht wurdenicht zugestellt!]:"_ & e.MailItem.Message.Subject '*** Priorität auf Hoch stellen - hat jedoch bisher keinen Effekt bei der Mail gehabt e.MailItem.DeliveryPriority = DeliveryPriority.High '* DSN (Deliver Status Notification auf Full setzen e.MailItem.DsnFormatRequested = DsnFormatRequested.Full '*** Der Exchangeserver ist nun der Absender e.MailItem.Message.Sender.DisplayName = "Microsoft Exchange" '*** und die Mailadresse des Postmasters einsertzen e.MailItem.Message.Sender.SmtpAddress = "postmaster@DYNASYS.de" '*** Hole den Body der Nachricht cMyBody = e.MailItem.Message.Body '*** lese den Body in "originalBody" ein Dim originalBody As System.IO.Stream = cMyBody.GetContentReadStream() '*** Setze einen Writer drauf, damit der Body erweitert werden kann Dim newBody As System.IO.Stream = cMyBody.GetContentWriteStream() '*** Prüfe/Hole die Codierung (Encoding) der Mail, die müssen wir beibehalten Dim encoding As Text.Encoding = Text.Encoding.GetEncoding(cMyBody.CharsetName)'*** Unterscheide das BodyFormat nach HTML, Text und RTF Select Case e.MailItem.Message.Body.BodyFormat.ToString.ToUpper Case "HTML" Dim conversion As New Microsoft.Exchange.Data._ TextConverters.HtmlToHtml '*** Hei HTML andere convertierung verwenden conversion.InputEncoding = encoding conversion.HeaderFooterFormat = Microsoft.Exchange.Data._ TextConverters.HeaderFooterFormat.Html conversion.Header = cNachricht'*** Den Text wollen wir als Header einfügen (am Kopf der Nachricht) conversion.Convert(originalBody, newBody) '*** Schreibe den Text in die Originalnachricht Case "TEXT" Dim conversion As New Microsoft.Exchange.Data._ TextConverters.TextToText conversion.InputEncoding = encoding conversion.HeaderFooterFormat = Microsoft.Exchange.Data._ TextConverters.HeaderFooterFormat.Text conversion.Header = cNachricht conversion.Convert(originalBody, newBody) Case "RTF" Dim conversion As New Microsoft.Exchange.Data._ TextConverters.RtfToRtf conversion.Header = cNachricht conversion.Convert(originalBody, newBody) End Select '*** Text wurde geschrieben, also Hilfsobjekte schließen newBody.Close() originalBody.Close() End If '*** eine Kopie an das Éxchangemeldungen Postfach e.MailItem.Recipients.Add(New RoutingAddress(cExchangeMeldungenSMTP)) '*** Nun wird die Mail weiterverarbeitet/zugestellt End If End If Catch ex As Exception '*** place your code here End Try End SubPrivate Function GetSMTPAddresses() As ArrayList Dim xSearchRoot As New DirectoryEntry Dim objSearcher As New DirectorySearcher '*** Such Object Dim objSearchResultCollection As SearchResultCollection '*** Ergebnis Sammlung Dim objResult As SearchResult '* Einzelergebnis Dim xGroupSMTP As New ArrayList '*** Eine Sammlung an SMTP Adressen Dim cSMTP As String '*** Eine SMTP Adresse Dim aHelp As ResultPropertyValueCollection Dim xSMTP As String Try objSearcher.SearchRoot = xSearchRoot objSearcher.Filter = "(msExchRequireAuthToSendTo=TRUE)" objSearcher.PropertiesToLoad.Add("name") objSearcher.PropertiesToLoad.Add("cn") objSearcher.PropertiesToLoad.Add("MailNickName") objSearcher.PropertiesToLoad.Add("proxyaddresses") objSearchResultCollection = objSearcher.FindAll()For Each objResult In objSearchResultCollection '*** analysiere nun alle Mailadressen (SMTPs interessieren uns) aHelp = objResult.Properties("proxyaddresses") '*** Weil es mehr als eine Mailadresse pro Gruppe geben kann... For Each xSMTP In aHelp xSMTP = xSMTP.ToUpper '*** GROSSBUCHSTABEN '*** Neben den SMTP Adressen gibt es auch X400 Adressen, die wollen wir aber nicht If xSMTP.Substring(0, 5) = "SMTP:" Then '*** Entferne SMTP:, damit es eine ordentliche Mailadresse wird. cSMTP = xSMTP.Replace("SMTP:", "") xGroupSMTP.Add(cSMTP) End If Next NextCatch ex As Exception xGroupSMTP = Nothing End TryReturn xGroupSMTP End Function End Class End Namespace
Installiert wird der Agent so:
(Powershell)
Install-TransportAgent -Name "DYNASYSBCCSMTPAgent" -TransportAgentFactory DYNASYSBCCRuleAgent.DYNASYSAgents.DYNASYSBCCRAFactory -AssemblyPath "D:\Program Files\Microsoft\Exchange Server\TransportRoles\agents\Rule\DYNASYSBCCRuleAgent.dll"Enable-TransportAgent -Identity "DYNASYSBCCSMTPAgent"Restart-Service "Microsoft Exchange Transport"
Wichtig: Die Powershell muss danach geschlossen werden, damit die Installation abgeschlossen ist.
Leave a Reply