Signatur
Beschreibung
imap_rfc822_parse_headers() analysiert einen rohen E-Mail-Header-String und zerlegt ihn in ein stdClass-Objekt mit benannten Eigenschaften für alle gängigen Header-Felder wie from, to, subject, date usw. Die Funktion folgt dabei dem RFC 2822-Standard für E-Mail-Nachrichten.
Die Funktion ist besonders nützlich, wenn bereits rohe Header-Daten als String vorliegen – etwa aus einer Datenbank, aus gespeicherten MIME-Nachrichten oder aus dem Rückgabewert anderer IMAP-Funktionen – und diese strukturiert weiterverarbeitet werden sollen, ohne alle Header-Felder manuell parsen zu müssen.
Der zweite Parameter defaulthost legt den Hostnamen fest, der für Adressen verwendet wird, bei denen kein Hostname angegeben ist. Standardmäßig wird 'UNKNOWN' verwendet. In produktiven Anwendungen empfiehlt es sich, hier den eigenen Mailserver-Hostnamen einzutragen.
Das zurückgegebene Objekt enthält Adress-Felder (z. B. from, to, cc) als Arrays von Objekten mit den Eigenschaften mailbox, host, personal und adl. Einfache Felder wie subject oder date sind direkte String-Eigenschaften des Objekts.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $headers Pflicht | string | Der rohe E-Mail-Header-String, der geparst werden soll. Mehrere Header-Felder werden durch Zeilenumbrüche (\r\n oder \n) getrennt. |
|
| $defaulthost | string | UNKNOWN | Hostname, der für Adressen ohne expliziten Hostnamen verwendet wird. Sollte in der Regel auf den eigenen Mailserver-Hostnamen gesetzt werden. |
Rückgabewert
Gibt ein stdClass-Objekt zurück, das die geparsten Header-Felder enthält. Typische Eigenschaften sind:
date– Datum der Nachricht als Stringsubject– Betreff der Nachricht als Stringmessage_id– Message-ID als Stringfrom– Array von Adress-Objekten (Absender)to– Array von Adress-Objekten (Empfänger)cc– Array von Adress-Objekten (CC-Empfänger)reply_to– Array von Adress-Objekten (Antwortadressen)
Adress-Objekte besitzen jeweils die Eigenschaften mailbox (lokaler Teil), host (Domain), personal (Anzeigename) und adl.
Beispiele
Einfache Header-Analyse
<?php
$rawHeaders = "From: Max Mustermann <max@example.com>\r\n"
. "To: Erika Muster <erika@example.com>\r\n"
. "Subject: Testmail\r\n"
. "Date: Mon, 01 Jan 2024 10:00:00 +0100\r\n"
. "Message-ID: <uniqueid@example.com>\r\n";
$parsed = imap_rfc822_parse_headers($rawHeaders, 'example.com');
echo 'Betreff: ' . $parsed->subject . "\n";
echo 'Datum: ' . $parsed->date . "\n";
// Absender-Informationen
$from = $parsed->from[0];
echo 'Von: ' . $from->personal . ' <' . $from->mailbox . '@' . $from->host . ">\n";
// Empfänger
$to = $parsed->to[0];
echo 'An: ' . $to->personal . ' <' . $to->mailbox . '@' . $to->host . ">\n";
Header aus einer IMAP-Nachricht parsen
<?php
// IMAP-Verbindung öffnen
$imap = imap_open('{imap.example.com:993/imap/ssl}INBOX', 'user@example.com', 'geheim');
if ($imap) {
// Rohen Header der ersten Nachricht abrufen
$rawHeader = imap_fetchheader($imap, 1);
// Header parsen
$headers = imap_rfc822_parse_headers($rawHeader, 'example.com');
echo 'Betreff: ' . $headers->subject . "\n";
echo 'Datum: ' . $headers->date . "\n";
if (!empty($headers->from)) {
$sender = $headers->from[0];
$address = $sender->mailbox . '@' . $sender->host;
echo 'Absender: ' . ($sender->personal ?? $address) . ' <' . $address . ">\n";
}
if (!empty($headers->cc)) {
echo 'CC-Empfänger:' . "\n";
foreach ($headers->cc as $cc) {
echo ' - ' . $cc->mailbox . '@' . $cc->host . "\n";
}
}
imap_close($imap);
}
// Wichtig · Fallstricke
Erweiterung erforderlich: Die Funktion ist Teil der IMAP-Erweiterung (ext-imap), die separat kompiliert bzw. aktiviert werden muss. Seit PHP 8.4 ist die IMAP-Erweiterung als PECL-Paket ausgelagert und nicht mehr im PHP-Kern enthalten.
Zeichenkodierung: Kodierte Wörter im Header (z. B. =?UTF-8?B?...?= gemäß RFC 2047) werden von dieser Funktion nicht automatisch dekodiert. Für dekodierte Subjects und Adressen sollte imap_utf8() oder imap_mime_header_decode() zusätzlich verwendet werden.
Validierung: Die Funktion validiert den Header-String nicht streng. Fehlende oder ungültige Felder führen in der Regel dazu, dass die entsprechende Eigenschaft im Ergebnisobjekt nicht gesetzt ist. Daher sollte vor dem Zugriff stets mit isset() oder !empty() geprüft werden.