The email module lacks a customized parser for the Received header. This is understandable since the Received header has only de-facto standardization with plenty of variety. Nonetheless, I needed a best-effort parser for my email filtering, and am happy with the results.
As an example, this source text:
Received: from mail-northcentralusazon11023100.outbound.protection.outlook.com ([40.107.201.100] helo=CH4PR04CU002.outbound.protection.outlook.com) by mx.serverdomain.com with esmtps (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from <info@senderdomain.com>) id 1viFZv-00FTF0-RT for user@receverdomain.com; Tue, 20 Jan 2026 12:32:58 -0500
can be parsed into these object properties:
helo: CH4PR04CU002.outbound.protection.outlook.com
ipaddress: 40.107.201.100
revdns:
rcvby: mx.serverdomain.com
protocol: esmtps
recipient: user@receverdomain.com
servermsgid: 1viFZv-00FTF0-RT
encryption: TLS1.3 TLS_AES_256_GCM_SHA384
viatext: Exim 4.94.2
globalip: True
timestamp: 2026-01-20 17:32:58
fcdnsHelo: False
fcdnsRdns: False
envelopefrom: info@senderdomain.com