Duplicate Message-ID

Exchange 2007 protokolliert solche Vorgänge mit der EvendID "DUPLICATE" im Message Tracking. Siehe auch Nachrichtentracking mit Exchange 2007.

Normalerweise bemerken Sie von der hier beschriebenen Funktion eines Exchange Servers gar nichts, denn er passiert eher selten. Fangen wir aber bei den Grundlagen an:

Diese Seite beschreibt im Detail die Erkennung doppelter Nachrichten. Sie finden hier keine Beschreibung eines Exchange Fehlers, sondern Hinweise, wie sie vielleicht den Grund für nicht nicht auffindbare Nachrichten finden können. Damit diese Fehler auftreten, muss sich der Absender nicht konform verhalten.

Was ist die Message-ID ?

Der Standard für den Versand einer Mail über SMTP schreiben vor, dass jede Mail eine eindeutige Kennzeichnung in Form einer Message-ID erhält. Dabei ist das erste System, welches die Nachricht per SMTP überträgt für die Generierung einer korrekten Message-ID zuständig.

  • Server
    Wenn Sie also Outlook per RPC an einem Exchange Server betreiben, per ActiveSync mit ihrem PDA eine Mail erstellen oder per OWA eine Mail verfassen und versenden, dann konvertiert der Exchange Server diese Nachricht in das SMTP-Format und erstellt eine eindeutige Message-ID.
  • Client
    Wenn Sie hingegen mit Outlook Express oder Outlook im Internet-Mode eine Mail versenden, dann sendet ihre Desktop die Nachricht schon per SMTP an den nächsten Mailserver und muss eine Message-ID erstellen.

Damit nun sichergestellt ist, dass eine Message-ID wirklich "einmalig" ist, wird die ID meist aus einer Zeichenkette und dem Hostnamen des Versenders gebildet. Ein Hostname sollte, sofern es sich um einen offiziellen Namen handelt, ja eindeutig sein. Dies ist aber nicht der Fall, wenn ein interner Name wie z.B. "SERVER01" genutzt wird, welcher auch in anderen Firmen vorkommen kann. Auch ist es nicht immer so konfiguriert, dass ein System einen DNS-Domänennamen hat. Sehr viele private PCs dürften einfach nur einen Hostnamen haben und ihre Mails per SMTP an den Provider senden.

Der vordere Teil einer Message-ID besteht häufig aus einem Zeitstempel, einer laufenden Nummer oder einer Kombination davon, so dass es ziemlich unwahrscheinlich ist, dass eine Message-ID weltweit doppelt vorkommt. Die Message-ID einer Mail können Sie ganz einfach in ihrem Programm nachschauen:

Outlook Kopfzeilen

In Outlook öffnen Sie die Mail und lassen sich die Nachrichtenoptionen anzeigen. In anderen Programmen finden Sie diese Informationen auch unter den "Eigenschaften" einer Mail oder über einen extra Punkt "Kopfzeilen".

So schön die Theorie ist, so gibt es doch Fälle, in denen die Message-ID nicht eindeutig ist: Hier drei Beispiele:

  • Mailcluster mit gleichem Namen
    Einige Mailsysteme nutzen den Hostnamen und einen Zeitstempel bzw. eine fortlaufende Nummer.  Werden nun mehrere Server als "Verbund" mit dem gleichen virtuellen Namen verschaltet, dann können die Server unabhängig voneinander die gleiche Message-ID vergeben. Daher unterstützt z.B. der SMTP-Server  EXIM eine Host-ID, die zur Message-ID hinzu gefügt wird. Der Admin muss dann jeder Instanz eine eindeutige Host-ID vergeben.
  • Schlechte Bildungsregel
    Natürlich ist ein Algorithmus nur so gut wie der Entwickler. Und nicht jeder Programmierer rechnet mit sehr vielen Mails in kurzer Zeit oder einem Ausfall und dem Verhalten nach einem Restore. So kann es dann auch passieren, dass der Programmcode einfach eine Message-ID mehrfach vergibt
  • Clientfunktion "erneut senden"
    Das gleiche passiert auch dem ein oder anderen Client. Auch ältere Versionen von Outlook im Internet Mode hatten den Fehler, dass eine Mail, die man aus "Gesendete Objekte" geöffnet und erneut versendet hat, die Message-ID beibehalten haben. Aus diesem Grund gibt es bei einigen Mailservern auch die Funktion, die Message-ID des Clients durch eine Message-ID des ersten Servers zu ersetzen.
  • Virenscanner
    Es gibt auch Informationen aus Newsgroups, dass ein Client Virenscanner beim Scan ausgehender Mails diese manchmal dupliziert.

Daher kann es durchaus sein, dass passiert, was eigentlich nicht passieren darf. Doch damit Sie die Folgen verstehen, muss man erst mal verstehen, warum die Message-ID wichtig ist.

Die Idee dahinter

Die Message-ID ist eine eindeutige Kennung einer Kommunikation und wird normalerweise auf dem Übertragungsweg nicht verändert.  Da nun alle Mailserver mehr oder weniger ausführliche Protokolle mitführen, können die Administratoren natürlich im Fehlerfall anhand der Message-ID genau den Weg und den Verbleib einer Mail nachvollziehen.

Die Message-ID kann aber auch genutzt werden, um aus Versehen mehrfache Kopien einer Mail an die gleichen Empfänger zu erkennen und zu unterdrücken. Das kann z.B. passieren wenn:

  • Abbruch nach dem "."
    Es ist theoretisch denkbar, dass der Absender die Mail per SMTP schon bis zum "." gesendet hat aber dann die Verbindung abbricht. Die "250 OK"-Meldung des Empfängers bekommt er dann nicht mehr. Der Empfänger hat die Mail aber und routet Sie weiter während der Absender diese noch ein zweites Mal versendet.
  • Restore einer Queue
    Auch Server "fallen" mal aus und da niemand für ein Backup die Warteschlangen leert und das Routing anhält, landet auch auf dem Backup immer ein Teil der aktuellen Warteschlange, welche beim Restore dann diese Mails erneut sendet
  • Mehrfachadressierung über Verteiler
    Wenn Sie eine Mail an einen Benutzer und zusätzlich an einen Verteiler senden, in dem der Benutzer ebenfalls enthalten ist, dann würde der Benutzer die Mail doppelt bekommen.
  • Das Mailsystem nur einen Teil der Message-ID auswertet
    Dazu gehört leider auch Exchange, welches ohne Hotfix nur die ersten 255 Zeichen betrachtet. Mails mit einer längeren Message-ID, die sich erst ab Stelle 256 und später unterscheidet, werden daher auch irrtümlich als "Dublette" erkannt.
  • Exchange 2007 Transport Dumpster
    Exchange 2007 kennt in Verbindung mit einem Cluster die Funktion, eventuell bei einem Schwenk verloren gegangene Mails erneut von der Hub/Transport-Rolle anzufordern.

Daher haben sehr viele Programme einen "Kurzzeitcache" um Nachrichten mit der gleichen Message-ID einfach zu löschen oder gar nicht erst zuzustellen. Dazu speichern diese Programme an einer geeigneten Stelle eben die Message-ID der letzten Nachrichten. Das ist übrigens kein Alleinstellungsmerkmal von Microsoft, sondern auch andere Produkte haben solche Filter eingebaut.

Exchange und Duplicate Message-ID

Auch Exchange hat im Informationsspeicher dies Funktion eingebaut. Dabei wird die Message-ID für eine Stunde in einer reservierten Tabelle gespeichert um doppelte Nachrichten zu erkennen. Das hört sich erst einmal einfach an aber die Probleme liegen wieder mal im Detail. Um die Folgen und Problem damit aufzuzeigen, habe ich hier vier Fälle als Bilder aufgezeichnet.

Fall 1: Mail an Verteiler und Benutzer

In diesem Fall sendet der Absender eine Mail an einen Verteiler und noch mal an den Benutzer 1. Der Benutzer 1 ist aber ebenfalls Mitglied in dem Verteiler. Da der Server, welcher den Verteiler "auflöst" nicht dem Postfachserver identisch sein muss, kann es sein, dass die Mail also schon früher "getrennt" (bifurcation) wurde und daher der Server, welcher den Verteiler aufsplittet, den Benutzer 1 noch einmal addiert.

Der Exchange Postfachserver erkennt aber anhand der Message-ID, dass die Mail schon einmal zugestellt wurde und stellt die Kopie gar nicht mehr zu. In diesem Fall ist die Erkennung von Dubletten wünschenswert und eine nützliche Funktion. Gerade wenn in Exchange Verteiler in Verteiler verschachtelt und Sie in mehreren Gruppen enthalten sind, dann werden so mehrfache Kopien vermieden. Auftrag erfüllt.

Fall 2: Externe Mail an zwei Empfänger

Um nun die Bedeutung für externe Nachrichten besser zu verstehen, zeige ich hier noch einmal den normalen Weg einer Mail aus dem Internet an zwei Empfänger im unternehmen:

Die Mail aus dem Internet wird . als eine Mail an den Mailserver übertragen. Dieser teilt die Mail anhand der Information im Envelope (RCPT TO) auf die beiden Mailboxenauf. Die beiden Mails haben die gleiche Message-ID aber sind ja "eine" Mail und werden daher korrekt zugestellt.

Fall 3: Externe Mail an zwei Empfänger unterschiedlicher Domains

Interessanter wird die Konstellation, wenn die Mail an zwei Empfänger in unterschiedlichen Domänen geht. Der absendende Mailserver teilt in dieser Situation die Mail schon auf in eine Nachricht je Domäne. werden nun beide Domänen in der gleichen Exchange Organisation gehostet und liegen die Benutzer auch noch auf dem gleichen Postfachserver, dann kann das folgende passieren:

Die Mail an user1 wird zuerst übermittelt und an Benutzer 1 zugestellt. Der "Store" merkt sich die Message-ID:A. Kurze Zeit später wird nun die zweite Mail an den user2 übermittelt. Beim Zustellen erkennt der Store aber, das eine Mail mit dieser Message-ID bereits empfangen wurde. Obwohl diese Mail nun einen anderen "RCPT TO"-Empfänger hat, ist sie Inhaltlich ja die gleiche. Wird eine Mail durch einen Server "getrennt", so bleibt die Message-ID erhalten.

Fall 4: Absender nutzt keine eindeutigen IDs

Ganz perfide und kaum zu Entdecken ist der Fall, dass der Absender die gleiche Message-ID bei unterschiedlichen Nachrichten verwendet. Das kann z.B. auch mit bestimmten Versionen von Outlook im Internet Mode passieren, wenn Sie ein Mail aus Outlook per SMTP versenden und später die Mail in "Gesendete Objekte" erneut öffnen und etwas anpassen und erneut senden. Es gibt Fälle, in der diese zweite Mail die gleiche Message-ID hat. Geht die Mail dann wieder an einen Empfänger im gleichen Postfachspeicher, dann kommt diese zweite Mail nicht an.

Im Messagetracking wird natürlich angezeigt, dass diese Mail in das Postfach zugestellt wurde, was es noch schwerer macht, den Fehler als solches zu finden. 

Fall 5: Maximale RCPT-TO Limit erreicht

Der letzte Fall beschreibt die Situation, dass jemand eine Mail an z.B.: 21 Personen sendet aber der Mailserver maximal 20 Empfänger (RCPT TO-Zeilen) pro Mail annimmt. In diesem Fall bekommt der absendende Server eine Fehlermeldung und sendet die folgenden Benutzer in einer zweiten Mail

RCPT TO Limit

Auch hier bekommt der Exchange Server dann eine Mail mit 20 Empfängern und weiterer Mails mit den restlichen Empfängern. Und alle Mails haben die gleiche Message-ID, die gleiche Zeit aber unterschiedliche Empfänger.

Exchange und Duplikate

Exchange „erkennt doppelte Mails anhand der Message-ID und hat eine Funktion eingebaut, die den Empfang „doppelter Nachrichten“ unterbinden soll. Dies kann z.B. passieren, wenn eine Mail an einen Empfänger und an einen Verteiler geht, in dem der Empfänger ebenfalls enthalten ist. Ohne besondere Vorkehrungen würde der Empfänger die Mail doppelt erhalten. Daher „merkt“ sich Exchange per Default eine Stunde die empfangenen Nachrichten. Der „Background Cleanup“-Prozess sorgt für die Bereinigung dieser Tabelle.

Diese Tabelle "DeliveredTo" gibt es pro Datenbank, d.h. auch Dubletten an unterschiedliche Empfänger mit der gleichen Message-ID werden unterdrückt, solange sich der Empfänger in der gleichen Datenbank befindet. Empfänger in einer anderen Datenbank, in die diese Mail erstmalig zugestellt wird, erhalten die Mail.

Exchange ist aber nicht ganz dumm, denn neben der Message-ID wird auch noch der Zeitstempel der Mail mit einbezogen, so dass die Mail mit der gleichen Message-ID aber unterschiedlichen Zeitstempeln natürlich zugestellt wird.

Wenn so eine Dubletten-Erkennung stattfindet und damit eine anscheinend identische Mail gelöscht wird, dann sollte dies zumindest den Administrator interessieren. Denn Abschalten kann man diese Funktion bei Exchange leider nicht. Exchange protokolliert solche Vorgänge jedoch im Eventlog, so dass Sie hier mit einer Überwachung ansetzen können. 

ID: 9537
Quelle: MSExchangeIS Mailbox Store
Version: 6.5.6940.0
Komponente: Microsoft Exchange-Informationsspeicher
Nachricht: Eine Nachricht wurde für Datenbank "<Name>" doppelt empfangen. Übermittlung der Nachricht an Empfänger wird ignoriert  (Internetnachrichten-ID <Nachrichten-ID>)

Bei Exchange 2007 wird diese Erkennung im Message Tracking mit der EventID "DUPLICATE" protokolliert.

Eine Mal mit der Message-ID kommt auch dann nicht an, wenn die TO-Adressen andere sind. der „Merker“ ist also pro Datenbank und nicht pro Server oder Empfängerpaarung. Auch Exchange 5.5 hat bereits solche eine Erkennung, die sich aber nicht auf die Message-ID stützt, sondern auf die Instance-ID

Welche Version ist betroffen ?

Ich habe noch nicht alle Versionen mit allen Fällen getestet aber folgendes kann ich heute schon sagen. Der Test für Fall 2 wurde mit einer Textdatei durchgeführt, die folgenden Inhalt hatte:

HELO test
MAIL FROM: user@extern.example.com
RCPT TO: user1@msxfaq.local
RCPT TO: user2@msxfaq.local
DATA
From: user@extern.example.com
To: user1@msxfaq.local, user2@msxfaq.local
Message-ID: <1234>
Date: Wed, 21 Mar 2007 12:34:56 +0100
Subject: Dublettentest

DupTest

.   <- hier steht ein "Punkt" alleine als Endezeichen

Diese Mail wurde per TELNET zweimal an den Mailserver übertragen und dann kontrolliert, welches Postfach wie viele Kopien erhalten hat. Die Mail wurde für die übrigen Fälle entsprechend angepasst.

Version SMTP-Dublettenerkennung Fall 1 Fall 2 Fall 3 Fall 4 Fall 5

Exchange 5.5 SP4

Ok Ja
MSG-ID RCPT TO und Time

Ok OK

Ok OK

Ok OK

Ok OK

Ok OK

Exchange 2000

Ok OK

 

 

 

 

Exchange 2003SP0

Ok Ja
MSG-ID RCPT TO und Time

Ok OK

Ok OK

Ok OK

Ok OK

Ok OK

Exchange 2003SP2

Ok Ja
MSG-ID RCPT TO und Time

Ok OK

 

 

 

 

Exchange 2007

Ok Ja
MSG-ID RCPT TO und Time

Ok OK

Ok OK

Ok OK

Ok OK

Ok OK

Exchange 2010

Ok Ja
MSG-ID RCPT TO und Time

Ok OK

Ok OK

Ok OK

Ok OK

Ok OK

Alternativ können Sie ja auch mal ihren Mailserver etwas ärgern, indem Sie die z.B.: die Zeit oder die Message-ID weg lassen. Dann können Sie sehen, dass z.B. der Windows SMTP-Server eine Message-ID addiert oder unter welchen umständen die Erkennung von Dubletten zuschlägt.

Ergebnis:
Exchange verhält sich in allen Fällen wie erwartet. Kein Sonderfall kann Exchange so wirklich aus dem Tritt bringen. Allerdings müssen Sie wissen, das eine Mail, bei der Message-ID, Datum/Zeit und RCPT-TO-Empfänger identisch sind, nur beim ersten Mal zugestellt wird.

Einstellungen

Man kann diese Funktion von Exchange auch einstellen. Normalerweise speichert sich der Store die Liste der MessageIDs für ca. 1 Stunde (maximal 49 Tage einstellbar) und ein zweiter Prozess räumt diese Liste wieder auf.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSExchangeIS\]
"Track Duplicates"=dword:1

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSExchangeI]
"Background Cleanup"=dword:3600000

Der Cleanup Prozess läuft auch per Default einmal je Stunde (eintrag im msec). Details finden Sie auf "How does duplicate detection work?" unter http://blogs.technet.com/b/exchange/archive/2004/07/14/183132.aspx.

Offen

Folgende Punkte sind noch zu testen bzw. zu verifizieren.

  • SMTP-Server Dublettenerkennung
    Ich hatte auch den Fall, dass eine mehrfach gesendete identische Mail erst gar nicht im Messagetracking aufgetaucht ist. Insofern muss wohl auch der Windows SMTP-Server eine vergleichbare Funktion haben. Hierüber konnte ich aber noch nichts in Erfahrung bringen
  • Outlook
    Outlook merkt sich anscheinend aber auch in einem 64k Rundlaufbuffer die empfangenen Message-IDs um Dubletten zu erkennen und solche Mails gleich zu löschen.

Wenn Sie diese Tests nachstellen wollen, müssen Sie sich nur eine Mail mit NOTEPAD erstellen und diese per TELNET an den Mailserver mehrfach identisch senden. Eine Lösung gibt es übrigens nicht bzw. nur halb. Sie können natürlich generell bei jeder eingehenden Mail die Message-ID entfernen, so dass Exchange eine eigene einmalige ID anfügt. (Siehe auch MessageID-Fix)

Weitere Links

  • How does duplicate detection work?
    http://blogs.technet.com/b/exchange/archive/2004/07/14/183132.aspx 
  • MSXFAQ - Dubletten
    So löschen Sie Kopien von Terminen, Kontakten und Mails ganz einfach
  • Exchange Teamblog: How does duplicate detection work?
    Blog http://blogs.technet.com/b/exchange/archive/2004/07/14/183132.aspx
  • 269408 XADM: Duplicate E-Mail in Exchange 2000
  • 289593 XADM: Exchange 2000 uses Duplicate Message ID When You Resend Message by using Outlook
  • 843234 In a Microsoft Exchange 2000 Server organization, some e-mail messages are not delivered when an e-mail message is sent from the Internet to multiple Exchange 2000 recipients
  • 823799 Forwarded message may be discarded as a duplicate in Exchange Server 5.5 or in Exchange Server 2003
  • 839268 Some of the messages are not delivered when you send several messages in Exchange Server 2003
  • Mailserver SENDMAIL
    slocal is able to detect and suppress duplicate messages. To enable this, use the option "-suppressdup". slocal will keep a database containing the Message-ID's of incoming messages, in order to detect duplicates. Depending on your configuration, this database will be in either ndbm or Berkeley db format.
  • Outlook Duplicate Items Remover 1.2
    http://www.vaita.com/ODIR.asp
    Wenn die Erkennung nicht funktionieren sollte, oder Sie anderweitig mit Dubletten kämpfen, kann diese Freeware ihnen beim Bereinigen helfen