Start · Sprachen · PHP · Referenz · imap_rfc822_parse_headers

imap_rfc822_parse_headers

Funktion

Parst einen String mit E-Mail-Headern gemäß RFC 2822 und gibt ein strukturiertes Objekt mit den enthaltenen Feldern zurück.

seit PHP 4.0.0 Kategorie: http

Signatur

imap_rfc822_parse_headers(string $headers, string $defaulthost = 'UNKNOWN'): stdClass

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

Typ
stdClass
Beschreibung

Gibt ein stdClass-Objekt zurück, das die geparsten Header-Felder enthält. Typische Eigenschaften sind:

  • date – Datum der Nachricht als String
  • subject – Betreff der Nachricht als String
  • message_id – Message-ID als String
  • from – 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";
Betreff: Testmail Datum: Mon, 01 Jan 2024 10:00:00 +0100 Von: Max Mustermann <max@example.com> An: Erika Muster <erika@example.com>

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.