Start · Sprachen · PHP · Referenz · imap_fetchmime

imap_fetchmime

Funktion

Ruft die MIME-Header eines bestimmten Abschnitts (Part) einer IMAP-Nachricht ab und gibt sie als String zurück.

seit PHP 5.3.6 Kategorie: http

Signatur

imap_fetchmime(IMAP\Connection $imap, int $message_num, string $section, int $flags = 0): string|false

Beschreibung

imap_fetchmime() liest die MIME-Kopfzeilen eines einzelnen Abschnitts einer E-Mail-Nachricht direkt vom IMAP-Server. Dabei wird die Nachricht anhand ihrer Sequenznummer (oder UID) sowie eines Abschnitts-Bezeichners (z. B. "1", "1.2", "2.HEADER") identifiziert.

Typische Einsatzgebiete sind das Auslesen von Content-Type, Content-Transfer-Encoding oder Content-Disposition eines einzelnen MIME-Teils, ohne den kompletten Nachrichteninhalt herunterladen zu müssen. Dies spart Bandbreite, wenn nur Metadaten eines Anhangs oder einer alternativen Darstellung benötigt werden.

Der optionale Parameter flags erlaubt die Übergabe von FT_UID, sodass message_num als eindeutige UID statt als Sequenznummer interpretiert wird. Weitere Flags wie FT_PEEK verhindern das automatische Setzen des \Seen-Flags.

Die Funktion ist eng verwandt mit imap_fetchstructure(), das die vollständige MIME-Struktur liefert, und mit imap_fetchbody(), das den eigentlichen Inhalt eines Abschnitts zurückgibt. Für eine robuste Verarbeitung empfiehlt sich die Kombination beider Funktionen.

Parameter

Name Typ Default Beschreibung
$imap Pflicht IMAP\Connection Eine aktive IMAP-Verbindung, die zuvor mit imap_open() geöffnet wurde.
$message_num Pflicht int Die Sequenznummer der Nachricht im Postfach, oder bei gesetztem FT_UID-Flag die eindeutige UID der Nachricht.
$section Pflicht string Der IMAP-Abschnittsbezeichner, z. B. "1", "1.2" oder "2.MIME". Gibt an, für welchen MIME-Part die Header abgerufen werden sollen.
$flags int 0 Optionale Flags. Mögliche Werte: FT_UID (behandelt message_num als UID), FT_PEEK (setzt das \Seen-Flag der Nachricht nicht), FT_INTERNAL (gibt Rohdaten ohne Zeilenumbruch-Normalisierung zurück).

Rückgabewert

Typ
string|false
Beschreibung
Gibt bei Erfolg die MIME-Header des angegebenen Abschnitts als String zurück. Im Fehlerfall (z. B. ungültige Verbindung, nicht vorhandener Abschnitt) wird false zurückgegeben.

Beispiele

MIME-Header eines Anhangs auslesen

<?php
// Verbindung zum IMAP-Server aufbauen
$imap = imap_open("{imap.example.com:993/imap/ssl}INBOX", "user@example.com", "geheimesPasswort");

if (!$imap) {
    die("Verbindung fehlgeschlagen: " . imap_last_error());
}

// Nachricht Nr. 1, Abschnitt 2 (z. B. erster Anhang)
$mimeHeader = imap_fetchmime($imap, 1, "2");

if ($mimeHeader !== false) {
    echo "MIME-Header des Abschnitts 2:\n";
    echo $mimeHeader;
} else {
    echo "Fehler beim Abrufen der MIME-Header.";
}

imap_close($imap);
?>
MIME-Header des Abschnitts 2: Content-Type: application/pdf; name="dokument.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="dokument.pdf"

MIME-Header per UID abrufen und Content-Type extrahieren

<?php
$imap = imap_open("{imap.example.com:993/imap/ssl}INBOX", "user@example.com", "geheimesPasswort");

$uid = 42; // Bekannte UID der Nachricht

// Abschnitt 1.2 (z. B. HTML-Teil einer Multipart-Nachricht) per UID laden
$mimeHeader = imap_fetchmime($imap, $uid, "1.2", FT_UID | FT_PEEK);

if ($mimeHeader !== false) {
    // Content-Type aus den Headern extrahieren
    if (preg_match('/^Content-Type:\s*([^;\r\n]+)/im', $mimeHeader, $matches)) {
        echo "Content-Type: " . trim($matches[1]) . "\n";
    }
} else {
    echo "Fehler: " . imap_last_error() . "\n";
}

imap_close($imap);
?>
Content-Type: text/html

// Wichtig · Fallstricke

Erweiterung: imap_fetchmime() setzt die IMAP-Erweiterung voraus (ext-imap). Ab PHP 8.1 wird statt einer Ressource ein IMAP\Connection-Objekt verwendet.

Abschnittsbezeichner: Um den richtigen Abschnitts-Bezeichner zu ermitteln, sollte zuvor imap_fetchstructure() aufgerufen werden. Die zurückgegebene Struktur zeigt die Nummerierung aller MIME-Parts.

Flag FT_PEEK: Ohne dieses Flag wird die Nachricht serverseitig als gelesen markiert (\Seen). Bei reinen Leseoperationen sollte FT_PEEK gesetzt werden, um den Nachrichtenstatus nicht unbeabsichtigt zu verändern.

Sicherheit: Eingaben wie message_num und section sollten validiert werden, bevor sie an die Funktion übergeben werden, um unerwartetes Verhalten durch manipulierte Werte zu verhindern.