24. September 2026 16 Min. Lesezeit

MailHeaderAnalyzer: E-Mail-Header in PowerShell auswerten, ohne Netzwerkzugriff

Referenz zum PowerShell-Modul MailHeaderAnalyzer: Parameterübersicht, Syntax, Beschreibung, Beispiele und Parametereigenschaften von Get-MailHeaderAnalysis und ConvertTo-MailHeaderReport, dazu das Ausgabeobjekt mit Zustellkette, Authentifizierungsergebnissen, Exchange-Online-Klassifizierung und allen Finding-Codes.

MailHeaderAnalyzer ist ein PowerShell-Modul mit zwei Cmdlets. Get-MailHeaderAnalysis wertet den Header einer E-Mail aus: Zustellkette mit Verzögerungen und TLS-Angaben, SPF-, DKIM-, DMARC- und ARC-Ergebnisse samt Prüfung, ob diese Ergebnisse vom empfangenden Server stammen, DMARC-Alignment, die Hybrid-Klassifizierung von Exchange Online, die Bewertungen von Microsoft Defender, SpamAssassin und Rspamd sowie Auffälligkeiten wie doppelte From-Zeilen oder Unicode-Steuerzeichen. ConvertTo-MailHeaderReport erzeugt daraus einen Bericht für Tickets. Das Modul arbeitet vollständig offline: keine DNS-Abfragen, keine HTTP-Verbindungen. Es ist die Kommandozeilen-Fassung des Header-Analyzers auf dieser Website und verwendet dieselbe Auswertungslogik.

ModulMailHeaderAnalyzer in der PowerShell Gallery
Quellcodepfstr/MailHeaderAnalyzer auf GitHub, MIT-Lizenz
Gilt fürWindows PowerShell 5.1, PowerShell 7.x; Windows, Linux, macOS; Exchange Management Shell
CmdletsGet-MailHeaderAnalysis, ConvertTo-MailHeaderReport

Parameterübersicht

CmdletParameterTypPflichtPipelineWirkung
Get-MailHeaderAnalysis-HeaderString[]Ja (Parametersatz Text)Ja, nach WertDer Header als Text. Zeilen aus der Pipeline werden zu einem Header zusammengesetzt
Get-MailHeaderAnalysis-PathString[]Ja (Parametersatz Path)Ja, nach EigenschaftsnameDatei mit dem Header oder vollständige .eml-Nachricht; nimmt Objekte von Get-ChildItem entgegen
Get-MailHeaderAnalysis-FromClipboardSwitchJa (Parametersatz Clipboard)NeinLiest den Header aus der Zwischenablage (nur Windows)
ConvertTo-MailHeaderReport-AnalysisMailHeaderAnalyzer.AnalysisJaJa, nach WertDas Ergebnisobjekt von Get-MailHeaderAnalysis
ConvertTo-MailHeaderReport-FormatStringNeinNeinMarkdown (Standard) oder Text

Beide Cmdlets unterstützen die Common Parameters -Verbose, -ErrorAction, -ErrorVariable, -OutVariable und die übrigen aus about_CommonParameters.

Installation

Install-Module -Name MailHeaderAnalyzer -Scope CurrentUser
OptionWirkung
-Name MailHeaderAnalyzerName des Moduls in der PowerShell Gallery
-Scope CurrentUserInstalliert in das Modulverzeichnis des Benutzers, ohne Administratorrechte

Auf einem System ohne Internetzugang laden Sie das Modul auf einem anderen Rechner mit Save-Module -Name MailHeaderAnalyzer -Path C:\Temp herunter und kopieren den Ordner MailHeaderAnalyzer in ein Verzeichnis aus $env:PSModulePath, zum Beispiel %USERPROFILE%\Documents\WindowsPowerShell\Modules (Windows PowerShell 5.1) oder %USERPROFILE%\Documents\PowerShell\Modules (PowerShell 7). Aktualisierungen holt Update-Module -Name MailHeaderAnalyzer, die installierte Version zeigt Get-Module -Name MailHeaderAnalyzer -ListAvailable.

Get-MailHeaderAnalysis

Wertet den Header einer E-Mail aus und gibt ein Analyseobjekt zurück.

Syntax

Text (Standard)

Get-MailHeaderAnalysis
    [-Header] <String[]>
    [<CommonParameters>]

Path

Get-MailHeaderAnalysis
    -Path <String[]>
    [<CommonParameters>]

Clipboard

Get-MailHeaderAnalysis
    -FromClipboard
    [<CommonParameters>]

Beschreibung

Das Cmdlet zerlegt den Rohheader in Felder, entfaltet RFC-5322-Faltungen und dekodiert RFC-2047-Werte in Betreff und Adressen. Aus den Received-Zeilen bildet es die Zustellkette in chronologischer Reihenfolge, berechnet die Verzögerung je Station und liest TLS-Version, Cipher und Protokollklasse nach RFC 3848. Aus Authentication-Results, Received-SPF, DKIM-Signature und der ARC-Kette ermittelt es die Authentifizierungsergebnisse und prüft, ob die Prüfzeile tatsächlich von einer Station der Zustellkette stammt (RFC 8601, Abschnitt 5). Dazu kommen das DMARC-Alignment, die Hybrid-Klassifizierung von Exchange Online, die Bewertungen der Spamfilter und eine Liste von Auffälligkeiten.

Das Cmdlet führt keine DNS-Abfragen durch und öffnet keine Netzwerkverbindung. Spf, Dkim und Dmarc sind deshalb immer das Urteil des empfangenden Servers, ergänzt um die Prüfung, ob dieses Urteil von ihm stammt. DKIM-Signaturen werden nicht kryptografisch nachgerechnet.

Eingaben werden tolerant gelesen: Eine Leerzeile beendet den Header, ein folgender Nachrichtentext wird ignoriert. Zeilen ohne Feldnamen und ohne führendes Leerzeichen, wie sie beim Kopieren aus Client-Dialogen entstehen, gehören zum vorhergehenden Feld. Eine mbox-Trennzeile From ... vor dem ersten Feld wird übersprungen, eine Byte Order Mark entfernt. Ausgewertet werden höchstens 200 Received-Zeilen, gezählt von der Zustellung her.

Beispiele

Beispiel 1

Get-MailHeaderAnalysis -FromClipboard

Wertet den Header aus, der sich in der Zwischenablage befindet. In Outlook für Windows finden Sie den Header unter Datei, Eigenschaften, Internetkopfzeilen; in Outlook im Web in den Nachrichtenoptionen unter „Nachrichtendetails anzeigen“.

Subject     : Service-Report für März
From        : Beispiel Newsletter <[email protected]>
Date        : 2026-08-03 09:14:27Z
SPF         : pass
DKIM        : pass
DMARC       : pass
ARC         : -
CompAuth    : pass (reason 100)
AuthTrust   : Absent (no authserv-id, Microsoft 365 style)
Hops        : 3 (total 00:00:42)
DeliveredBy : zr0p278mb0570.chep278.prod.outlook.com
Findings    : none

Beispiel 2

Get-MailHeaderAnalysis -Path .\nachricht.eml

Wertet eine gespeicherte Nachricht aus. Die Datei darf nur den Header oder die vollständige Nachricht enthalten; der Nachrichtentext wird ignoriert.

Beispiel 3

(Get-MailHeaderAnalysis -Path .\nachricht.eml).Hops

Zeigt die Zustellkette als Tabelle, erster Hop zuerst.

#   From                 IP              By                                     Protocol   TLS      Time (UTC)           Delay
-   ----                 --              --                                     --------   ---      ----------           -----
1   client.example.net   198.51.100.34   mail.example.org                       ESMTPSA    -        2026-08-03 09:14:28  -
2   mail.example.org     203.0.113.25    mx.eur02.prod.protection.outlook.com   Microsoft… TLS 1.3  2026-08-03 09:15:09  41 s
3   AM0EUR02FT056.eop…   -               ZR0P278MB0570.CHEP278.PROD.OUTLOOK.COM Microsoft… TLS 1.2  2026-08-03 09:15:10  1 s

Beispiel 4

Get-Content -Path .\header.txt | Get-MailHeaderAnalysis | Select-Object -ExpandProperty Findings

Liest den Header zeilenweise aus einer Textdatei und zeigt nur die Auffälligkeiten. -Raw bei Get-Content ist nicht nötig, das Cmdlet setzt die Zeilen selbst zusammen.

Beispiel 5

Get-ChildItem -Path .\export\*.eml |
    Get-MailHeaderAnalysis |
    Select-Object Source, Subject, Spf, Dkim, Dmarc, AuthTrust, HopCount,
        @{ Name = 'Findings'; Expression = { ($_.Findings.Code | Sort-Object -Unique) -join ',' } } |
    Export-Csv -Path .\auswertung.csv -NoTypeInformation -Encoding UTF8

Wertet alle Nachrichten eines Ordners aus und schreibt eine CSV-Datei mit einer Zeile je Nachricht. Die berechnete Spalte fasst die Finding-Codes zusammen.

OptionWirkung
Get-ChildItem -Path .\export\*.emlLiefert die Dateiobjekte; -Path übernimmt deren Eigenschaft FullName
Select-Object … @{ Name; Expression }Berechnete Spalte, die alle Finding-Codes zu einer Zeichenkette zusammenfasst
Export-Csv -NoTypeInformation -Encoding UTF8CSV ohne Typkopfzeile, UTF-8 für Umlaute in Betreffzeilen

Beispiel 6

Get-ChildItem .\export\*.eml |
    Get-MailHeaderAnalysis |
    Where-Object AuthTrust -eq 'Unmatched' |
    Select-Object Source, AuthServId, DeliveredBy

Listet Nachrichten, deren Authentication-Results-Zeile nicht vom zustellenden System stammt. Bei Phishing-Analysen ist das ein schneller erster Filter.

Beispiel 7

$a = Get-MailHeaderAnalysis -Path .\nachricht.eml
$a.Hops[$a.SlowestHopIndex - 1] | Format-List Index, FromHost, ByHost, Delay

Zeigt die Station mit der grössten Verzögerung. SlowestHopIndex ist 1-basiert, das Array Hops 0-basiert.

Beispiel 8

Get-MailHeaderAnalysis -Path .\nachricht.eml | ConvertTo-Json -Depth 6 | Set-Content .\analyse.json

Schreibt die vollständige Analyse als JSON. -Depth 6 ist nötig, weil Hops, DkimSignatures und Exchange verschachtelte Objekte sind; der Standardwert 2 würde sie nur als Typnamen ausgeben.

Parameter

-Header

Der Header als Text. Der Parameter nimmt einen einzelnen String mit dem ganzen Header oder mehrere Strings entgegen; Pipeline-Eingaben werden gesammelt und am Ende zu einem Header zusammengesetzt, deshalb funktioniert Get-Content datei | Get-MailHeaderAnalysis ohne -Raw. Sollen mehrere Header getrennt ausgewertet werden, verwenden Sie -Path mit mehreren Dateien.

Aliase: Text, Raw, InputObject

ParametereigenschaftWert
TypString[]
StandardwertKein
Platzhalter unterstütztNein
Parametersatz TextWert
Position0
PflichtJa
Wert aus PipelineJa
Wert aus Pipeline nach EigenschaftsnameNein

-Path

Pfad zu einer Datei, die den Header oder eine vollständige .eml-Nachricht enthält. Relative Pfade werden gegen das aktuelle Verzeichnis aufgelöst. Die Datei wird mit [System.IO.File]::ReadAllText gelesen: Eine Byte Order Mark wird berücksichtigt, ohne BOM gilt UTF-8. Für jede Datei entsteht ein eigenes Ergebnisobjekt; fehlende Dateien erzeugen einen nicht abbrechenden Fehler.

Aliase: FullName, PSPath, LiteralPath

ParametereigenschaftWert
TypString[]
StandardwertKein
Platzhalter unterstütztNein
Parametersatz PathWert
PositionBenannt
PflichtJa
Wert aus PipelineNein
Wert aus Pipeline nach EigenschaftsnameJa

-FromClipboard

Liest den Header mit Get-Clipboard -Raw aus der Zwischenablage. Der Parameter ist nur unter Windows verfügbar; auf Linux und macOS bricht das Cmdlet mit einer Fehlermeldung ab, ebenso bei leerer Zwischenablage.

ParametereigenschaftWert
TypSwitchParameter
StandardwertFalse
Platzhalter unterstütztNein
Parametersatz ClipboardWert
PositionBenannt
PflichtJa
Wert aus PipelineNein
Wert aus Pipeline nach EigenschaftsnameNein

Eingaben

System.String: Headerzeilen oder der ganze Header, an -Header.

System.IO.FileInfo: Dateiobjekte von Get-ChildItem, deren FullName an -Path gebunden wird.

Ausgaben

MailHeaderAnalyzer.Analysis: ein Objekt je ausgewertetem Header. Die Eigenschaften sind im Abschnitt Ausgabeobjekt beschrieben.

Hinweise

Der Analysetext (Erklärungen in Findings, CompAuthReasonMeaning und den Bedeutungsfeldern) ist englisch, damit er unverändert in internationale Tickets passt. Die Ausgabe der Standardansicht lässt sich mit Format-List * vollständig anzeigen.

ConvertTo-MailHeaderReport

Erzeugt aus einem Analyseobjekt einen Bericht als Markdown oder Text.

Syntax

ConvertTo-MailHeaderReport
    [-Analysis] <Object>
    [-Format <String>]
    [<CommonParameters>]

Beschreibung

Der Bericht umfasst Betreff, Absender, Datum und Message-ID, die Authentifizierungsergebnisse mit Herkunftsangabe und Alignment, alle Findings, die Zustellkette, die Exchange-Klassifizierung und die Werte der Spamfilter. Unicode-Steuerzeichen für die Schreibrichtung bleiben im Bericht als <U+...> sichtbar, damit sie über den Bericht nicht in ein Ticketsystem gelangen. Die letzte Zeile nennt die Modulversion.

Beispiele

Beispiel 1

Get-MailHeaderAnalysis -Path .\nachricht.eml | ConvertTo-MailHeaderReport | Set-Clipboard

Erzeugt einen Markdown-Bericht und legt ihn in die Zwischenablage.

# Email header analysis

- Subject: Service-Report für März
- From: Beispiel Newsletter <[email protected]>
- Date: 2026-08-03T09:14:27Z
- Message-ID: <[email protected]>

## Authentication

- spf: pass
- dkim: pass
- dmarc: pass
- compauth: pass (reason=100: passed authentication)
- Results without authserv-id (Microsoft 365 style)
- DMARC alignment: SPF Strict, DKIM Strict

## Delivery chain (total: 42 s)

| # | From | By | Protocol | TLS | Time (UTC) | Delay |
|---|---|---|---|---|---|---|
| 1 | client.example.net (198.51.100.34) | mail.example.org | ESMTPSA | - | 2026-08-03T09:14:28Z | - |
| 2 | mail.example.org (203.0.113.25) | mx.eur02.prod.protection.outlook.com | Microsoft SMTP Server | TLS 1.3 | 2026-08-03T09:15:09Z | 41 s |
| 3 | AM0EUR02FT056.eop-EUR02.prod.protection.outlook.com | ZR0P278MB0570.CHEP278.PROD.OUTLOOK.COM | Microsoft SMTP Server | TLS 1.2 | 2026-08-03T09:15:10Z | 1 s |

Beispiel 2

Get-MailHeaderAnalysis -FromClipboard | ConvertTo-MailHeaderReport -Format Text

Gibt den Bericht als Text ohne Markdown-Auszeichnung aus, etwa für E-Mails oder Konsolenprotokolle.

Beispiel 3

Import-Module MailHeaderAnalyzer
Get-MailHeaderAnalysis -Path 'C:\Temp\bounce.eml' | ConvertTo-MailHeaderReport -Format Text

Verwendung in der Exchange Management Shell. Ist $env:PSModulePath dort durch Gruppenrichtlinien eingeschränkt, laden Sie das Modul mit Import-Module und dem vollständigen Pfad zur .psd1-Datei.

Parameter

-Analysis

Das Analyseobjekt von Get-MailHeaderAnalysis. Andere Objekttypen weist das Cmdlet mit einem Bindungsfehler ab.

ParametereigenschaftWert
TypMailHeaderAnalyzer.Analysis
StandardwertKein
Platzhalter unterstütztNein
Parametersatz (alle)Wert
Position0
PflichtJa
Wert aus PipelineJa
Wert aus Pipeline nach EigenschaftsnameNein

-Format

Das Ausgabeformat. Gültige Werte:

  • Markdown: Überschriften, Aufzählungen und die Zustellkette als Tabelle. Standard.
  • Text: Überschriften in Grossbuchstaben, eingerückte Zeilen, die Zustellkette als nummerierte Liste.
ParametereigenschaftWert
TypString
Zulässige WerteMarkdown, Text
StandardwertMarkdown
Platzhalter unterstütztNein
Parametersatz (alle)Wert
PositionBenannt
PflichtNein
Wert aus PipelineNein
Wert aus Pipeline nach EigenschaftsnameNein

Eingaben

MailHeaderAnalyzer.Analysis: das Ergebnis von Get-MailHeaderAnalysis.

Ausgaben

System.String: der Bericht, ein String je Analyseobjekt.

Ausgabeobjekt

Get-MailHeaderAnalysis gibt je Eingabe ein Objekt vom Typ MailHeaderAnalyzer.Analysis zurück. Die Standardansicht zeigt die Zusammenfassung aus Beispiel 1; alle Eigenschaften sind über Select-Object, Format-List * oder ConvertTo-Json zugänglich.

MailHeaderAnalyzer.Analysis

EigenschaftTypInhalt
SourceStringDateipfad, Clipboard oder Text
SubjectStringBetreff, RFC 2047 dekodiert
From, ReplyTo, ReturnPathAdressobjektName, Address, Domain, Display; $null, wenn das Feld fehlt
DateDateTime (UTC)Wert des Date-Felds
MessageIdStringMessage-ID
MailFromDomainStringEnvelope-Absenderdomain aus smtp.mailfrom der SPF-Prüfung, sonst aus Return-Path
Spf, Dkim, Dmarc, Arc, CompAuthStringErgebnis laut massgebender Authentication-Results-Zeile (pass, fail, none, softfail und weitere); $null, wenn nicht geprüft
CompAuthReason, CompAuthReasonMeaningStringReason-Code der zusammengesetzten Authentifizierung von Microsoft 365 und seine Bedeutung
AuthTrustStringMatched, Unmatched, Absent oder None, siehe AuthTrust
AuthServIdStringauthserv-id der massgebenden Prüfzeile
AuthenticationResultsObjekt[]Alle Authentication-Results-Zeilen mit AuthServId, Methods, Trust, Raw
ReceivedSpfObjektDie Received-SPF-Zeile mit Result und Properties
SpfAlignment, DkimAlignmentStringStrict, Relaxed, None oder $null
HopsHop[]Zustellkette in chronologischer Reihenfolge, siehe Hop-Objekt
HopCount, TotalDuration, SlowestHopIndex, HasClockSkewInt, TimeSpan, Int, BoolKennzahlen der Kette
DeliveredByStringby-Host der jüngsten Received-Zeile, also die zustellende Station
DkimSignaturesObjekt[]Je Signatur Domain, Selector, Algorithm, Canonicalization, SignedHeaders, BodyLength, Timestamp, Expires, ReceiverResult, Tags
ArcChain, ArcValidObjekt[], BoolARC-Instanzen mit Instance, SealDomain, ChainValidation, Methods; ArcValid ist $null ohne ARC-Kette
ExchangeObjektHybrid-Klassifizierung von Exchange Online, siehe Exchange-Objekt; $null ohne entsprechende Header
SpamObjektBewertungen der Spamfilter, siehe Spam-Objekt; $null ohne entsprechende Header
ListObjektListId, Unsubscribe, OneClick (RFC 8058); $null ohne Listen-Header
FindingsFinding[]Auffälligkeiten mit Severity, Code, Message, siehe Findings
FieldsObjekt[]Alle Felder mit Name, Value (entfaltet) und Raw
HadBodyBoolOb nach dem Header ein Nachrichtentext folgte

MailHeaderAnalyzer.Hop

Jeder Eintrag in Hops entspricht einer Received-Zeile. Die Reihenfolge ist chronologisch, also umgekehrt zur Reihenfolge im Header.

EigenschaftInhalt
IndexLaufende Nummer, 1 = Einlieferung
FromHost, Helo, ReverseDns, IPAddress, IsPrivateIPAngaben zum einliefernden System aus dem from-Teil; die IP stammt aus der eckigen Klammer im Kommentar, der rDNS-Name aus dem Kommentar davor
ByHost, SoftwareEmpfangendes System und dessen Software (Kommentar hinter by)
Protocol, ProtocolClasswith-Wert und Klasse nach RFC 3848: TlsAuthenticated (ESMTPSA), Tls (ESMTPS oder TLS-Angabe vorhanden), Authenticated (ESMTPA), Plain, Http, Mapi, Local
TlsVersion, TlsCipherAus den Schreibweisen von Microsoft (version=TLS1_2, cipher=…), Postfix (using TLSv1.3 with cipher …) und Exim
Id, For, ViaWeitere Received-Bestandteile
DateZeitstempel hinter dem Semikolon, UTC
DelayTimeSpan zum vorhergehenden Hop; negativ bei Uhrenversatz
ProviderErkannter Anbieter oder Gateway anhand der Hostnamen (Microsoft 365, Google Workspace, SEPPmail, HIN, Proofpoint, Mimecast und weitere)
Attested$true nur beim letzten Hop: allein diese Zeile hat das empfangende System selbst geschrieben, alle darunter standen bereits in der Nachricht
RawDie Originalzeile

AuthTrust: Herkunft der Prüfergebnisse

Eine Authentication-Results-Zeile kann jeder Absender selbst in eine Nachricht schreiben. Nach RFC 8601, Abschnitt 5, ist nur die Zeile der empfangenden Organisation massgebend, und deren authserv-id muss sich einer Station der Zustellkette zuordnen lassen. Das Cmdlet vergleicht die authserv-id jeder Zeile mit den by-Hosts der Received-Kette (gleiche Domain oder Subdomain, immer an der Punktgrenze, kein Teilstring).

WertBedeutung
MatchedDie authserv-id kommt als by-Host in der Kette vor. Nur solche Zeilen fliessen in Spf, Dkim, Dmarc ein, sobald mindestens eine existiert
UnmatchedDie authserv-id kommt in der Kette nicht vor. Die Ergebnisse werden angezeigt, gelten aber als unbelegte Behauptung; das Finding AuthUnverified weist darauf hin
AbsentDie Zeile trägt keine authserv-id. Microsoft 365 schreibt seine Prüfzeile in dieser Form, sie beginnt direkt mit spf=
NoneKeine Prüfzeile vorhanden

Enthält der Header Prüfzeilen mehrerer Herkünfte, meldet das Finding AuthMixedOrigins den Sachverhalt. Fehlt eine Prüfzeile, aber eine Received-SPF-Zeile ist vorhanden, wird deren Ergebnis als Spf übernommen und mit ReceivedSpfOnly gekennzeichnet.

DMARC-Alignment

SpfAlignment vergleicht die Envelope-Absenderdomain mit der From-Domain, DkimAlignment die d=-Domain der geprüften Signatur mit der From-Domain. Strict bedeutet identische Domain, Relaxed dieselbe Organisationsdomain, None keine Übereinstimmung. Die Organisationsdomain wird heuristisch bestimmt: die letzten zwei Labels, bei bekannten mehrteiligen Endungen wie co.uk oder com.au die letzten drei. Eine vollständige Public Suffix List ist nicht enthalten.

MailHeaderAnalyzer.ExchangeClassification

Enthält der Header Felder X-MS-Exchange-Organization-*, X-OriginatorOrg oder X-MS-Exchange-CrossTenant-*, füllt das Cmdlet die Eigenschaft Exchange. Die Bedeutungen folgen dem Artikel „Demystifying hybrid mail flow“ des Exchange-Teams; die Hintergründe stehen im Artikel Exchange-Hybrid-Header: intern oder extern?.

EigenschaftInhalt
Directionality, DirectionalityMeaningOriginating oder Incoming mit Erklärung
AuthAs, AuthAsMeaningInternal oder Anonymous mit den Folgen für die EOP-Filterung
AuthSourceServer, der die Einstufung vorgenommen hat
AuthMechanism, AuthMechanismMeaningMechanismus-Code. Nur der Wert 10 (Externally Secured) ist öffentlich dokumentiert; für alle anderen Codes nennt das Modul ausdrücklich, dass Microsoft sie nicht dokumentiert
OriginatorOrgStandard-Domäne des sendenden Tenants, das nicht fälschbare Tenant-Merkmal beim Empfang aus Microsoft 365
CrossTenantAuthAs, CrossTenantAuthSource, CrossTenantIdEinstufung und Tenant-ID an der Tenant-Grenze
CrossTenantFromEntity, CrossTenantFromMeaningInternet, Hosted oder HybridOnPrem mit Erklärung
WrongTenantAttributionWert von X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp, wenn die Nachricht einem fremden Tenant zugeordnet wurde
OrganizationHeadersPreserved, CrossPremisesHeadersFilteredMarker für erhaltene beziehungsweise vom Sendeconnector entfernte Organisations-Header

MailHeaderAnalyzer.SpamAssessment

Die Eigenschaft Spam fasst die Bewertungen der bekannten Filter zusammen. Die Werte stammen aus fremden Systemen und werden dekodiert, aber nicht bewertet.

EigenschaftQuelleInhalt
Scl, SclMeaningX-Forefront-Antispam-Report, X-Microsoft-AntispamSpam Confidence Level mit Bedeutung (-1 vertrauenswürdig, 0/1 kein Spam, 5/6 Spamverdacht, 9 sehr wahrscheinlich Spam)
BclX-Microsoft-AntispamBulk Complaint Level 0 bis 9
Category, CategoryMeaningCAT:Klassifizierung wie SPM, PHSH, HPHSH, MALW, SPOOF, DIMP, UIMP, BULK
SpamFilterVerdict, SpamFilterMeaningSFV:Filterergebnis wie NSPM, SPM, SKA (Allowlist), SKI (intraorganisatorisch)
IPVerdict, IPVerdictMeaningIPV:CAL (IP auf Verbindungs-Allowlist) oder NLI (keine Reputation)
Direction, DirectionMeaningDIR:INB, OUT, INT
ConnectingIP, CountryCIP:, CTRY:Einliefernde IP und Herkunftsland
ForefrontX-Forefront-Antispam-ReportAlle Schlüssel-Wert-Paare des Felds
SpamAssassinScore, SpamAssassinTestsX-Spam-StatusPunktzahl und ausgelöste Tests
RspamdSymbolsX-Spamd-Result, X-Spam-ReportSymbole mit Punktzahl

Die vollständige Liste der compauth-Reason-Codes steht im Artikel Microsoft 365 compauth: Reason-Codes.

Findings

Auffälligkeiten liefert das Cmdlet als Objekte in Findings, jeweils mit Severity (Info, Warning, Fail), einem stabilen Code für Filter und Skripte sowie einer Erklärung in Message.

CodeSchweregradBedeutung
DuplicateFieldWarningEin Feld, das RFC 5322 auf eine Instanz begrenzt (From, Subject, Date, Message-ID und weitere), kommt mehrfach vor. Mailclients und Filter wählen unter Umständen verschiedene Instanzen; ein bekanntes Muster bei Fälschungen
BidiControlsWarningUnicode-Steuerzeichen für die Schreibrichtung in einem Feld. Sie kehren die Leserichtung um, fdp.exe erscheint dann als exe.pdf. Das Modul zeigt sie als <U+202E>
HopOverflowWarningMehr als 200 Received-Zeilen; die überzähligen wurden nicht ausgewertet
AuthUnverifiedWarningDie Prüfergebnisse tragen eine authserv-id, die in der Zustellkette nicht vorkommt
AuthMixedOriginsWarningPrüfzeilen mehrerer Herkünfte vorhanden
ReceivedSpfForeignWarningDer receiver= der Received-SPF-Zeile kommt in der Kette nicht vor
ReceivedSpfOnlyInfoDas SPF-Ergebnis stammt nur aus Received-SPF, nicht aus einer Prüfzeile
NoAuthResultsInfoKeine Prüfergebnisse im Header
DmarcFailFailDMARC laut Empfangsserver nicht bestanden
SpfNotPassWarningSPF-Ergebnis fail, softfail, permerror oder temperror
DkimNotPassWarningDKIM-Ergebnis fail, permerror oder temperror ohne ARC-Zeugen
DkimBrokenAfterForwardInfoDKIM beim Empfänger nicht bestanden, aber ein ARC-Siegel derselben Domain bezeugt eine zuvor gültige Signatur: typisch für Weiterleitungen und Mailinglisten
DkimWeakHashWarningSignatur mit rsa-sha1 (RFC 8301 stuft SHA-1 als veraltet ein)
DkimBodyLengthWarningl=-Tag begrenzt die signierte Länge des Nachrichtentexts; angehängter Inhalt ist nicht abgedeckt
DkimExpiredWarningx=-Zeitpunkt liegt in der Vergangenheit
DkimFromUnsignedWarningDas From-Feld ist nicht in h= enthalten, obwohl RFC 6376 es verlangt
ClockSkewInfoEin Hop trägt einen früheren Zeitstempel als sein Vorgänger; die Verzögerungen sind nur Näherungswerte
ReplyToMismatchInfoReply-To-Domain weicht von der From-Domain ab; bei Newslettern üblich, bei Phishing ein Muster
SpfNotAlignedInfoEnvelope-Absenderdomain und From-Domain gehören zu verschiedenen Organisationen; SPF trägt dann nicht zu DMARC bei
ExchangeWrongTenantWarningNachricht wurde einem fremden Tenant zugeordnet; klassische Ursache ist ein Inbound-Connector eines anderen Tenants mit demselben Zertifikat oder denselben IP-Adressen
ExchangeHeadersFilteredWarningDer Sendeconnector hat die Cross-Premises-Header entfernt (KB3212872)
ExchangeExternallySecuredWarningAuthMechanism 10: Eingang über einen Empfangsconnector mit „Externally Secured“, EOP-Filterung übersprungen
SpamCategoryWarningMicrosoft hat eine Kategorie ungleich NONE vergeben
SpamConfidenceWarningSCL 5 oder höher

Funktionsweise und Grenzen

Das Modul liest, was im Header steht, und leitet daraus ab, was sich ohne externe Abfrage belegen lässt. Daraus folgen einige Grenzen:

  • Keine kryptografische Prüfung. DKIM-Signaturen werden nicht nachgerechnet und DNS-Einträge nicht abgefragt. Spf, Dkim und Dmarc sind immer das Urteil des empfangenden Servers, ergänzt um die Prüfung, ob dieses Urteil überhaupt von ihm stammt.
  • Nur die letzte Received-Zeile ist belegt. Alle Zeilen darunter hat der Absender mitgeliefert und kann sie beliebig gestaltet haben. Attested markiert diesen Unterschied; die Verzögerungen früherer Hops beruhen auf den Angaben dieser Zeilen.
  • Organisationsdomänen heuristisch. Für das Relaxed-Alignment nutzt das Modul eine kurze Liste mehrteiliger Endungen, keine vollständige Public Suffix List.
  • AuthMechanism nur teilweise dokumentiert. Ausser dem Wert 10 hat Microsoft die Codes nicht veröffentlicht; das Modul erfindet keine Bedeutungen.
  • Zeichensätze. RFC-2047-Werte werden mit den Kodierungen dekodiert, die .NET auf dem jeweiligen System kennt. Unbekannte Zeichensätze bleiben unverändert stehen.

Datenschutz

Ein vollständiger Header enthält interne Hostnamen, IP-Adressen, Absender, Empfänger und Betreff. Warum diese Angaben nicht in ein Online-Tool gehören, steht im Artikel E-Mail-Header analysieren, ohne die Mail hochzuladen. Für das Modul gilt dasselbe Versprechen wie für die Browser-Fassung: keine Netzwerkzugriffe. Die Testsuite des Moduls enthält einen Test, der fehlschlägt, sobald im Quellcode ein Netzwerk- oder DNS-Cmdlet auftaucht.

Quellcode und Versionen

Der Quellcode steht unter MIT-Lizenz auf GitHub. Die Auswertungslogik ist eine Portierung der Bibliothek, die auch der Header-Analyzer auf dieser Website verwendet; beide teilen sich die Testfälle. Die Continuous Integration prüft jede Änderung mit PSScriptAnalyzer und Pester auf Windows PowerShell 5.1, PowerShell 7 unter Windows, Ubuntu und macOS. Veröffentlichungen in der PowerShell Gallery erfolgen automatisch aus versionierten Tags; die Änderungen je Version stehen im Changelog.

Fehler und Erweiterungswünsche nehme ich als Issue auf GitHub entgegen. Testheader für Fehlerberichte bitte vorher anonymisieren; die mitgelieferten Testfälle verwenden ausschliesslich Beispieldomänen nach RFC 2606 und Adressen nach RFC 5737.

Quellen

  1. MailHeaderAnalyzer in der PowerShell Gallery

    Paketseite mit Installationsbefehl und Versionsverlauf.

    https://www.powershellgallery.com/packages/MailHeaderAnalyzer
  2. pfstr/MailHeaderAnalyzer auf GitHub

    Quellcode, Testsuite, Changelog und Issues.

    https://github.com/pfstr/MailHeaderAnalyzer
  3. Microsoft Learn: Get-MessageTraceV2

    Vorlage für die Gliederung dieser Referenz (Syntax, Beschreibung, Beispiele, Parametereigenschaften).

    https://learn.microsoft.com/en-us/powershell/module/exchangepowershell/get-messagetracev2?view=exchange-ps
  4. RFC 8601: Message Header Field for Indicating Message Authentication Status

    Aufbau von Authentication-Results und die Regel, dass nur die Zeile der empfangenden Organisation massgebend ist (Abschnitt 5).

    https://www.rfc-editor.org/rfc/rfc8601
  5. RFC 5321: Simple Mail Transfer Protocol

    Aufbau der Received-Zeilen und die Empfehlung einer Obergrenze als Schleifenschutz (Abschnitt 6.3).

    https://www.rfc-editor.org/rfc/rfc5321
  6. RFC 3848: ESMTP and LMTP Transmission Types Registration

    Die with-Werte ESMTPS, ESMTPA und ESMTPSA.

    https://www.rfc-editor.org/rfc/rfc3848
  7. RFC 6376: DomainKeys Identified Mail (DKIM) Signatures

    Tags der DKIM-Signature, Pflicht zur Signierung von From.

    https://www.rfc-editor.org/rfc/rfc6376
  8. RFC 8301: Cryptographic Algorithm and Key Usage Update to DKIM

    Einstufung von rsa-sha1 als veraltet.

    https://www.rfc-editor.org/rfc/rfc8301
  9. RFC 7489: Domain-based Message Authentication, Reporting, and Conformance (DMARC)

    Strict und Relaxed Alignment.

    https://www.rfc-editor.org/rfc/rfc7489
  10. RFC 8617: The Authenticated Received Chain (ARC) Protocol

    ARC-Seal, ARC-Authentication-Results und die cv=-Kettenprüfung.

    https://www.rfc-editor.org/rfc/rfc8617
  11. Microsoft Learn: Anti-spam message headers in Microsoft 365

    Bedeutung von SCL, BCL, CAT, SFV, IPV und der compauth-Reason-Codes.

    https://learn.microsoft.com/en-us/defender-office-365/message-headers-eop-mdo
  12. Exchange Team Blog: Demystifying hybrid mail flow
  13. Header-Analyzer auf rafaelpfister.ch

    Die Browser-Fassung mit derselben Auswertungslogik.

    https://rafaelpfister.ch/tools/header-analyzer

Kommentare

Die Kommentare werden von GitHub / Giscus geladen.