Signatur
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
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 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);
?>
// 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.