24 septembre 2026 16 min de lecture

MailHeaderAnalyzer : analyser les en-têtes d’e-mails dans PowerShell sans accès réseau

Référence du module PowerShell MailHeaderAnalyzer : aperçu des paramètres, syntaxe, description, exemples et propriétés des paramètres de Get-MailHeaderAnalysis et ConvertTo-MailHeaderReport, ainsi que l’objet de sortie avec la chaîne de distribution, les résultats d’authentification, la classification Exchange Online et tous les codes de constat.

MailHeaderAnalyzer est un module PowerShell doté de deux cmdlets. Get-MailHeaderAnalysis analyse l’en-tête d’un e-mail : chaîne de distribution avec délais et informations TLS, résultats SPF, DKIM, DMARC et ARC, y compris la vérification que ces résultats proviennent du serveur destinataire, alignement DMARC, classification hybride d’Exchange Online, évaluations de Microsoft Defender, SpamAssassin et Rspamd, ainsi que des anomalies telles que des lignes From en double ou des caractères de contrôle Unicode. ConvertTo-MailHeaderReport génère à partir de cela un rapport pour les tickets. Le module fonctionne entièrement hors ligne : aucune requête DNS, aucune connexion HTTP. C’est la version en ligne de commande de l’analyseur d’en-têtes de ce site web et il utilise la même logique d’analyse.

ModuleMailHeaderAnalyzer dans la PowerShell Gallery
Code sourcepfstr/MailHeaderAnalyzer sur GitHub, licence MIT
S’applique àWindows PowerShell 5.1, PowerShell 7.x ; Windows, Linux, macOS ; Exchange Management Shell
CmdletsGet-MailHeaderAnalysis, ConvertTo-MailHeaderReport

Aperçu des paramètres

CmdletParamètreTypeObligatoirePipelineEffet
Get-MailHeaderAnalysis-HeaderString[]Oui (jeu de paramètres Text)Oui, par valeurL’en-tête sous forme de texte. Les lignes du pipeline sont assemblées en un en-tête
Get-MailHeaderAnalysis-PathString[]Oui (jeu de paramètres Path)Oui, par nom de propriétéFichier contenant l’en-tête ou le message .eml complet ; accepte les objets de Get-ChildItem
Get-MailHeaderAnalysis-FromClipboardSwitchOui (jeu de paramètres Clipboard)NonLit l’en-tête depuis le presse-papiers (Windows uniquement)
ConvertTo-MailHeaderReport-AnalysisMailHeaderAnalyzer.AnalysisOuiOui, par valeurL’objet de résultat de Get-MailHeaderAnalysis
ConvertTo-MailHeaderReport-FormatStringNonNonMarkdown (par défaut) ou Text

Les deux cmdlets prennent en charge les paramètres communs -Verbose, -ErrorAction, -ErrorVariable, -OutVariable et les autres décrits dans about_CommonParameters.

Installation

Install-Module -Name MailHeaderAnalyzer -Scope CurrentUser
OptionEffet
-Name MailHeaderAnalyzerNom du module dans la PowerShell Gallery
-Scope CurrentUserInstalle dans le répertoire de modules de l’utilisateur, sans droits d’administrateur

Sur un système sans accès Internet, téléchargez le module sur un autre ordinateur avec Save-Module -Name MailHeaderAnalyzer -Path C:\Temp et copiez le dossier MailHeaderAnalyzer dans un répertoire figurant dans $env:PSModulePath, par exemple %USERPROFILE%\Documents\WindowsPowerShell\Modules (Windows PowerShell 5.1) ou %USERPROFILE%\Documents\PowerShell\Modules (PowerShell 7). Update-Module -Name MailHeaderAnalyzer récupère les mises à jour, et Get-Module -Name MailHeaderAnalyzer -ListAvailable affiche la version installée.

Get-MailHeaderAnalysis

Analyse l’en-tête d’un e-mail et renvoie un objet d’analyse.

Syntaxe

Text (par défaut)

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

Path

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

Clipboard

Get-MailHeaderAnalysis
    -FromClipboard
    [<CommonParameters>]

Description

La cmdlet décompose l’en-tête brut en champs, déplie les replis RFC 5322 et décode les valeurs RFC 2047 dans l’objet et les adresses. À partir des lignes Received, elle constitue la chaîne de distribution dans l’ordre chronologique, calcule le délai de chaque relais et lit la version TLS, le chiffrement et la classe de protocole selon RFC 3848. À partir de Authentication-Results, Received-SPF, DKIM-Signature et de la chaîne ARC, elle détermine les résultats d’authentification et vérifie si la ligne de vérification provient effectivement d’une station de la chaîne de distribution (RFC 8601, section 5). S’y ajoutent l’alignement DMARC, la classification hybride d’Exchange Online, les évaluations des filtres antispam et une liste d’anomalies.

La cmdlet n’effectue aucune requête DNS et n’ouvre aucune connexion réseau. Spf, Dkim et Dmarc correspondent donc toujours au verdict du serveur destinataire, complété par la vérification que ce verdict provient bien de lui. Les signatures DKIM ne sont pas recalculées cryptographiquement.

Les entrées sont lues de manière tolérante : une ligne vide termine l’en-tête, et tout corps de message qui suit est ignoré. Les lignes sans nom de champ et sans espace initial, comme celles produites lors d’une copie depuis les boîtes de dialogue d’un client, appartiennent au champ précédent. Une ligne de séparation mbox From ... avant le premier champ est ignorée et une marque d’ordre des octets est supprimée. Au maximum 200 lignes Received sont analysées, comptées depuis la remise.

Exemples

Exemple 1

Get-MailHeaderAnalysis -FromClipboard

Analyse l’en-tête présent dans le presse-papiers. Dans Outlook pour Windows, vous trouverez l’en-tête sous Fichier, Propriétés, En-têtes Internet ; dans Outlook sur le web, dans les options du message sous « Afficher les détails du message ».

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

Exemple 2

Get-MailHeaderAnalysis -Path .\nachricht.eml

Analyse un message enregistré. Le fichier peut contenir uniquement l’en-tête ou le message complet ; le corps du message est ignoré.

Exemple 3

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

Affiche la chaîne de distribution sous forme de tableau, premier relais en premier.

#   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

Exemple 4

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

Lit l’en-tête ligne par ligne depuis un fichier texte et n’affiche que les anomalies. -Raw avec Get-Content n’est pas nécessaire, la cmdlet assemble elle-même les lignes.

Exemple 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

Analyse tous les messages d’un dossier et écrit un fichier CSV contenant une ligne par message. La colonne calculée regroupe les codes de constat.

OptionEffet
Get-ChildItem -Path .\export\*.emlFournit les objets fichier ; -Path reprend leur propriété FullName
Select-Object … @{ Name; Expression }Colonne calculée qui regroupe tous les codes de constat dans une chaîne
Export-Csv -NoTypeInformation -Encoding UTF8CSV sans ligne d’en-tête de type, UTF-8 pour les caractères accentués dans les lignes d’objet

Exemple 6

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

Liste les messages dont la ligne Authentication-Results ne provient pas du système de remise. Pour les analyses de phishing, c’est un premier filtre rapide.

Exemple 7

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

Affiche la station ayant le plus grand délai. SlowestHopIndex est basé sur 1, le tableau Hops sur 0.

Exemple 8

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

Écrit l’analyse complète au format JSON. -Depth 6 est nécessaire, car Hops, DkimSignatures et Exchange sont des objets imbriqués ; la valeur par défaut de 2 ne les afficherait que sous forme de noms de type.

Paramètres

-Header

L’en-tête sous forme de texte. Le paramètre accepte une seule chaîne contenant tout l’en-tête ou plusieurs chaînes ; les entrées du pipeline sont collectées puis assemblées en un en-tête à la fin, c’est pourquoi Get-Content datei | Get-MailHeaderAnalysis fonctionne sans -Raw. Pour analyser séparément plusieurs en-têtes, utilisez -Path avec plusieurs fichiers.

Alias : Text, Raw, InputObject

Propriété du paramètreValeur
TypeString[]
Valeur par défautAucune
Caractères génériques pris en chargeNon
Jeu de paramètres TextValeur
Position0
ObligatoireOui
Valeur depuis le pipelineOui
Valeur depuis le pipeline par nom de propriétéNon

-Path

Chemin vers un fichier contenant l’en-tête ou un message .eml complet. Les chemins relatifs sont résolus par rapport au répertoire actuel. Le fichier est lu avec [System.IO.File]::ReadAllText : une marque d’ordre des octets est prise en compte ; sans BOM, UTF-8 est utilisé. Chaque fichier produit un objet de résultat distinct ; les fichiers manquants génèrent une erreur non bloquante.

Alias : FullName, PSPath, LiteralPath

Propriété du paramètreValeur
TypeString[]
Valeur par défautAucune
Caractères génériques pris en chargeNon
Jeu de paramètres PathValeur
PositionNommée
ObligatoireOui
Valeur depuis le pipelineNon
Valeur depuis le pipeline par nom de propriétéOui

-FromClipboard

Lit l’en-tête depuis le presse-papiers avec Get-Clipboard -Raw. Le paramètre n’est disponible que sous Windows ; sous Linux et macOS, la cmdlet s’arrête avec un message d’erreur, de même si le presse-papiers est vide.

Propriété du paramètreValeur
TypeSwitchParameter
Valeur par défautFalse
Caractères génériques pris en chargeNon
Jeu de paramètres ClipboardValeur
PositionNommée
ObligatoireOui
Valeur depuis le pipelineNon
Valeur depuis le pipeline par nom de propriétéNon

Entrées

System.String : lignes d’en-tête ou l’en-tête complet, vers -Header.

System.IO.FileInfo : objets fichier de Get-ChildItem, dont la propriété FullName est liée à -Path.

Sorties

MailHeaderAnalyzer.Analysis : un objet par en-tête analysé. Les propriétés sont décrites dans la section Objet de sortie.

Remarques

Le texte d’analyse (explications dans Findings, CompAuthReasonMeaning et les champs de signification) est en anglais afin de pouvoir être repris sans modification dans des tickets internationaux. La sortie de l’affichage standard peut être affichée intégralement avec Format-List *.

ConvertTo-MailHeaderReport

Génère un rapport au format Markdown ou texte à partir d’un objet d’analyse.

Syntaxe

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

Description

Le rapport comprend l’objet, l’expéditeur, la date et le Message-ID, les résultats d’authentification avec indication de provenance et alignement, tous les constats, la chaîne de distribution, la classification Exchange et les valeurs des filtres antispam. Les caractères de contrôle Unicode de direction d’écriture restent visibles dans le rapport sous la forme <U+...>, afin qu’ils ne soient pas transmis à un système de tickets par le rapport. La dernière ligne indique la version du module.

Exemples

Exemple 1

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

Génère un rapport Markdown et le place dans le presse-papiers.

# 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 |

Exemple 2

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

Produit le rapport en texte sans balisage Markdown, par exemple pour des e-mails ou des journaux de console.

Exemple 3

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

Utilisation dans Exchange Management Shell. Si $env:PSModulePath y est restreint par des stratégies de groupe, chargez le module avec Import-Module et le chemin complet vers le fichier .psd1.

Paramètres

-Analysis

L’objet d’analyse de Get-MailHeaderAnalysis. La cmdlet rejette les autres types d’objets avec une erreur de liaison.

Propriété du paramètreValeur
TypeMailHeaderAnalyzer.Analysis
Valeur par défautAucune
Caractères génériques pris en chargeNon
Jeu de paramètres (tous)Valeur
Position0
ObligatoireOui
Valeur depuis le pipelineOui
Valeur depuis le pipeline par nom de propriétéNon

-Format

Le format de sortie. Valeurs valides :

  • Markdown : titres, listes et chaîne de distribution sous forme de tableau. Valeur par défaut.
  • Text : titres en majuscules, lignes indentées, chaîne de distribution sous forme de liste numérotée.
Propriété du paramètreValeur
TypeString
Valeurs autoriséesMarkdown, Text
Valeur par défautMarkdown
Caractères génériques pris en chargeNon
Jeu de paramètres (tous)Valeur
PositionNommée
ObligatoireNon
Valeur depuis le pipelineNon
Valeur depuis le pipeline par nom de propriétéNon

Entrées

MailHeaderAnalyzer.Analysis : le résultat de Get-MailHeaderAnalysis.

Sorties

System.String : le rapport, une chaîne par objet d’analyse.

Objet de sortie

Get-MailHeaderAnalysis renvoie un objet de type MailHeaderAnalyzer.Analysis par entrée. L’affichage standard montre le résumé de l’exemple 1 ; toutes les propriétés sont accessibles via Select-Object, Format-List * ou ConvertTo-Json.

MailHeaderAnalyzer.Analysis

PropriétéTypeContenu
SourceStringChemin de fichier, Clipboard ou Text
SubjectStringObjet, décodé selon RFC 2047
From, ReplyTo, ReturnPathObjet d’adresseName, Address, Domain, Display; $null si le champ est absent
DateDateTime (UTC)Valeur du champ Date
MessageIdStringMessage-ID
MailFromDomainStringDomaine de l’expéditeur d’enveloppe issu de smtp.mailfrom de la vérification SPF, sinon de Return-Path
Spf, Dkim, Dmarc, Arc, CompAuthStringRésultat selon la ligne Authentication-Results faisant autorité (pass, fail, none, softfail et autres) ; $null si non vérifié
CompAuthReason, CompAuthReasonMeaningStringCode de raison de l’authentification composite de Microsoft 365 et sa signification
AuthTrustStringMatched, Unmatched, Absent ou None, voir AuthTrust
AuthServIdStringauthserv-id de la ligne de vérification faisant autorité
AuthenticationResultsObjet[]Toutes les lignes Authentication-Results avec AuthServId, Methods, Trust, Raw
ReceivedSpfObjetLa ligne Received-SPF avec Result et Properties
SpfAlignment, DkimAlignmentStringStrict, Relaxed, None ou $null
HopsHop[]Chaîne de distribution dans l’ordre chronologique, voir objet Hop
HopCount, TotalDuration, SlowestHopIndex, HasClockSkewInt, TimeSpan, Int, BoolIndicateurs de la chaîne
DeliveredByStringHôte by de la ligne Received la plus récente, c’est-à-dire la station de remise
DkimSignaturesObjet[]Par signature : Domain, Selector, Algorithm, Canonicalization, SignedHeaders, BodyLength, Timestamp, Expires, ReceiverResult, Tags
ArcChain, ArcValidObjet[], BoolInstances ARC avec Instance, SealDomain, ChainValidation, Methods; ArcValid vaut $null sans chaîne ARC
ExchangeObjetClassification hybride d’Exchange Online, voir objet Exchange; $null sans en-têtes correspondants
SpamObjetÉvaluations des filtres antispam, voir objet Spam; $null sans en-têtes correspondants
ListObjetListId, Unsubscribe, OneClick (RFC 8058) ; $null sans en-têtes de liste
FindingsFinding[]Anomalies avec Severity, Code, Message, voir Findings
FieldsObjet[]Tous les champs avec Name, Value (déplié) et Raw
HadBodyBoolIndique si un corps de message suivait l’en-tête

MailHeaderAnalyzer.Hop

Chaque entrée de Hops correspond à une ligne Received. L’ordre est chronologique, donc inverse à l’ordre dans l’en-tête.

PropriétéContenu
IndexNuméro séquentiel, 1 = dépôt
FromHost, Helo, ReverseDns, IPAddress, IsPrivateIPInformations sur le système émetteur issues de la partie from ; l’IP provient des crochets dans le commentaire, le nom rDNS du commentaire qui le précède
ByHost, SoftwareSystème destinataire et son logiciel (commentaire après by)
Protocol, ProtocolClassValeur with et classe selon RFC 3848 : TlsAuthenticated (ESMTPSA), Tls (ESMTPS ou indication TLS présente), Authenticated (ESMTPA), Plain, Http, Mapi, Local
TlsVersion, TlsCipherÀ partir des notations de Microsoft (version=TLS1_2, cipher=…), Postfix (using TLSv1.3 with cipher …) et Exim
Id, For, ViaAutres composants de Received
DateHorodatage après le point-virgule, UTC
DelayTimeSpan jusqu’au relais précédent ; négatif en cas de décalage d’horloge
ProviderFournisseur ou passerelle détecté à partir des noms d’hôte (Microsoft 365, Google Workspace, SEPPmail, HIN, Proofpoint, Mimecast et autres)
Attested$true uniquement pour le dernier relais : seule cette ligne a été écrite par le système destinataire lui-même, toutes celles situées en dessous étaient déjà présentes dans le message
RawLa ligne originale

AuthTrust : origine des résultats de vérification

Une ligne Authentication-Results peut être ajoutée à un message par n’importe quel expéditeur. Selon RFC 8601, section 5, seule la ligne de l’organisation destinataire fait autorité, et son authserv-id doit pouvoir être attribué à une station de la chaîne de distribution. La cmdlet compare l’authserv-id de chaque ligne aux hôtes by de la chaîne Received (même domaine ou sous-domaine, toujours à la limite du point, jamais par sous-chaîne).

ValeurSignification
MatchedL’authserv-id apparaît comme hôte by dans la chaîne. Seules ces lignes sont prises en compte dans Spf, Dkim, Dmarc dès lors qu’il en existe au moins une
UnmatchedL’authserv-id n’apparaît pas dans la chaîne. Les résultats sont affichés, mais considérés comme une affirmation non étayée ; le constat AuthUnverified le signale
AbsentLa ligne ne contient pas d’authserv-id. Microsoft 365 écrit sa ligne de vérification sous cette forme, elle commence directement par spf=
NoneAucune ligne de vérification présente

Si l’en-tête contient des lignes de vérification provenant de plusieurs sources, le constat AuthMixedOrigins le signale. En l’absence de ligne de vérification mais en présence d’une ligne Received-SPF, son résultat est repris comme Spf et marqué ReceivedSpfOnly.

Alignement DMARC

SpfAlignment compare le domaine de l’expéditeur d’enveloppe au domaine From, tandis que DkimAlignment compare le domaine d= de la signature vérifiée au domaine From. Strict signifie un domaine identique, Relaxed le même domaine organisationnel et None aucune correspondance. Le domaine organisationnel est déterminé de manière heuristique : les deux derniers labels, ou les trois derniers pour les terminaisons composées connues telles que co.uk ou com.au. Une liste complète des suffixes publics n’est pas incluse.

MailHeaderAnalyzer.ExchangeClassification

Si l’en-tête contient les champs X-MS-Exchange-Organization-*, X-OriginatorOrg ou X-MS-Exchange-CrossTenant-*, la cmdlet renseigne la propriété Exchange. Les significations suivent l’article « Demystifying hybrid mail flow » de l’équipe Exchange ; le contexte est expliqué dans l’article En-têtes hybrides Exchange : interne ou externe ?.

PropriétéContenu
Directionality, DirectionalityMeaningOriginating ou Incoming avec explication
AuthAs, AuthAsMeaningInternal ou Anonymous avec les conséquences pour le filtrage EOP
AuthSourceServeur ayant effectué la classification
AuthMechanism, AuthMechanismMeaningCode de mécanisme. Seule la valeur 10 (Externally Secured) est documentée publiquement ; pour tous les autres codes, le module précise expressément que Microsoft ne les documente pas
OriginatorOrgDomaine par défaut du tenant expéditeur, caractéristique de tenant infalsifiable à la réception depuis Microsoft 365
CrossTenantAuthAs, CrossTenantAuthSource, CrossTenantIdClassification et ID de tenant à la frontière du tenant
CrossTenantFromEntity, CrossTenantFromMeaningInternet, Hosted ou HybridOnPrem avec explication
WrongTenantAttributionValeur de X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp lorsque le message a été attribué à un tenant tiers
OrganizationHeadersPreserved, CrossPremisesHeadersFilteredMarqueurs des en-têtes d’organisation reçus ou supprimés du connecteur d’envoi

MailHeaderAnalyzer.SpamAssessment

La propriété Spam regroupe les évaluations des filtres connus. Les valeurs proviennent de systèmes tiers et sont décodées, mais non évaluées.

PropriétéSourceContenu
Scl, SclMeaningX-Forefront-Antispam-Report, X-Microsoft-AntispamSpam Confidence Level avec signification (-1 fiable, 0/1 non spam, 5/6 suspicion de spam, 9 très probablement du spam)
BclX-Microsoft-AntispamBulk Complaint Level de 0 à 9
Category, CategoryMeaningCAT:Classification telle que SPM, PHSH, HPHSH, MALW, SPOOF, DIMP, UIMP, BULK
SpamFilterVerdict, SpamFilterMeaningSFV:Résultat du filtre tel que NSPM, SPM, SKA (liste d’autorisation), SKI (intra-organisationnel)
IPVerdict, IPVerdictMeaningIPV:CAL (IP dans la liste d’autorisation de connexion) ou NLI (aucune réputation)
Direction, DirectionMeaningDIR:INB, OUT, INT
ConnectingIP, CountryCIP:, CTRY:IP émettrice et pays d’origine
ForefrontX-Forefront-Antispam-ReportToutes les paires clé-valeur du champ
SpamAssassinScore, SpamAssassinTestsX-Spam-StatusScore et tests déclenchés
RspamdSymbolsX-Spamd-Result, X-Spam-ReportSymboles avec score

La liste complète des codes de raison compauth figure dans l’article Microsoft 365 compauth : codes de raison.

Findings

La cmdlet fournit les anomalies sous forme d’objets dans Findings, chacun avec Severity (Info, Warning, Fail), un Code stable pour les filtres et scripts, ainsi qu’une explication dans Message.

CodeGravitéSignification
DuplicateFieldWarningUn champ que RFC 5322 limite à une seule instance (From, Subject, Date, Message-ID et d’autres) est présent plusieurs fois. Les clients de messagerie et filtres peuvent sélectionner des instances différentes ; c’est un motif connu de falsification
BidiControlsWarningCaractères de contrôle Unicode de direction d’écriture dans un champ. Ils inversent le sens de lecture : fdp.exe apparaît alors comme exe.pdf. Le module les affiche comme <U+202E>
HopOverflowWarningPlus de 200 lignes Received ; les lignes excédentaires n’ont pas été analysées
AuthUnverifiedWarningLes résultats de vérification comportent un authserv-id absent de la chaîne de distribution
AuthMixedOriginsWarningLignes de vérification provenant de plusieurs sources présentes
ReceivedSpfForeignWarningLe receiver= de la ligne Received-SPF n’apparaît pas dans la chaîne
ReceivedSpfOnlyInfoLe résultat SPF provient uniquement de Received-SPF, et non d’une ligne de vérification
NoAuthResultsInfoAucun résultat de vérification dans l’en-tête
DmarcFailFailDMARC a échoué selon le serveur destinataire
SpfNotPassWarningRésultat SPF fail, softfail, permerror ou temperror
DkimNotPassWarningRésultat DKIM fail, permerror ou temperror sans témoin ARC
DkimBrokenAfterForwardInfoDKIM a échoué chez le destinataire, mais un sceau ARC du même domaine atteste une signature antérieurement valide : typique des redirections et listes de diffusion
DkimWeakHashWarningSignature avec rsa-sha1 (RFC 8301 considère SHA-1 comme obsolète)
DkimBodyLengthWarningLa balise l= limite la longueur signée du corps du message ; le contenu ajouté n’est pas couvert
DkimExpiredWarningL’instant x= est situé dans le passé
DkimFromUnsignedWarningLe champ From n’est pas contenu dans h=, bien que RFC 6376 l’exige
ClockSkewInfoUn relais porte un horodatage antérieur à celui de son prédécesseur ; les délais ne sont que des approximations
ReplyToMismatchInfoLe domaine Reply-To diffère du domaine From ; courant pour les newsletters, mais également un motif de phishing
SpfNotAlignedInfoLe domaine de l’expéditeur d’enveloppe et le domaine From appartiennent à des organisations différentes ; SPF ne contribue alors pas à DMARC
ExchangeWrongTenantWarningLe message a été attribué à un tenant tiers ; une cause classique est un connecteur entrant d’un autre tenant utilisant le même certificat ou les mêmes adresses IP
ExchangeHeadersFilteredWarningLe connecteur d’envoi a supprimé les en-têtes cross-premises (KB3212872)
ExchangeExternallySecuredWarningAuthMechanism 10 : réception via un connecteur de réception avec « Externally Secured », filtrage EOP ignoré
SpamCategoryWarningMicrosoft a attribué une catégorie autre que NONE
SpamConfidenceWarningSCL 5 ou supérieur

Fonctionnement et limites

Le module lit ce qui figure dans l’en-tête et en déduit ce qui peut être établi sans requête externe. Cela implique certaines limites :

  • Aucune vérification cryptographique. Les signatures DKIM ne sont pas recalculées et les enregistrements DNS ne sont pas interrogés. Spf, Dkim et Dmarc correspondent toujours au verdict du serveur destinataire, complété par la vérification que ce verdict provient bien de lui.
  • Seule la dernière ligne Received est établie. Toutes les lignes situées en dessous ont été fournies par l’expéditeur, qui peut les façonner à sa guise. Attested marque cette différence ; les délais des relais antérieurs reposent sur les indications de ces lignes.
  • Domaines organisationnels déterminés heuristiquement. Pour l’alignement Relaxed, le module utilise une courte liste de terminaisons composées, et non une liste complète des suffixes publics.
  • AuthMechanism seulement partiellement documenté. Hormis la valeur 10, Microsoft n’a pas publié les codes ; le module n’invente aucune signification.
  • Jeux de caractères. Les valeurs RFC 2047 sont décodées avec les encodages que .NET connaît sur le système concerné. Les jeux de caractères inconnus restent inchangés.

Protection des données

Un en-tête complet contient des noms d’hôte internes, des adresses IP, des expéditeurs, des destinataires et l’objet. L’article Analyser des en-têtes d’e-mails sans téléverser le message explique pourquoi ces informations n’ont pas leur place dans un outil en ligne. La même promesse s’applique au module qu’à la version navigateur : aucun accès réseau. La suite de tests du module contient un test qui échoue dès qu’une cmdlet réseau ou DNS apparaît dans le code source.

Code source et versions

Le code source est disponible sous licence MIT sur GitHub. La logique d’analyse est un portage de la bibliothèque également utilisée par l’analyseur d’en-têtes de ce site web ; les deux partagent les cas de test. L’intégration continue vérifie chaque modification avec PSScriptAnalyzer et Pester sous Windows PowerShell 5.1, PowerShell 7 sur Windows, Ubuntu et macOS. Les publications dans la PowerShell Gallery sont effectuées automatiquement à partir de balises versionnées ; les modifications de chaque version sont indiquées dans le changelog.

Vous pouvez soumettre les erreurs et demandes d’amélioration comme issue sur GitHub. Veuillez anonymiser les en-têtes de test avant de signaler une erreur ; les cas de test inclus utilisent exclusivement des domaines d’exemple conformes à RFC 2606 et des adresses conformes à RFC 5737.

Sources

  1. MailHeaderAnalyzer dans la PowerShell Gallery

    page du package avec commande d’installation et historique des versions.

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

    code source, suite de tests, changelog et issues.

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

    modèle de la structure de cette référence (syntaxe, description, exemples, propriétés des paramètres).

    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

    structure de Authentication-Results et règle selon laquelle seule la ligne de l’organisation destinataire fait autorité (section 5).

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

    structure des lignes Received et recommandation d’une limite supérieure comme protection contre les boucles (section 6.3).

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

    valeurs with ESMTPS, ESMTPA et ESMTPSA.

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

    balises de DKIM-Signature, obligation de signer From.

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

    classification de rsa-sha1 comme obsolète.

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

    alignement Strict et Relaxed.

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

    ARC-Seal, ARC-Authentication-Results et vérification de chaîne cv=.

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

    signification de SCL, BCL, CAT, SFV, IPV et des codes de raison compauth.

    https://learn.microsoft.com/en-us/defender-office-365/message-headers-eop-mdo
  12. Blog de l’équipe Exchange : Demystifying hybrid mail flow
  13. Analyseur d’en-têtes sur rafaelpfister.ch

    version navigateur utilisant la même logique d’analyse.

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

Commentaires

Les commentaires sont chargés depuis GitHub / Giscus.