Start · Sprachen · PHP · Referenz · imap_append

imap_append

Funktion

Hängt eine fertig formatierte E-Mail-Nachricht als String an ein IMAP-Postfach (Ordner) an.

seit PHP 4.0.0 Kategorie: http

Signatur

imap_append(IMAP\Connection $imap, string $folder, string $message, ?string $options = null, ?string $internal_date = null): bool

Beschreibung

imap_append() ermöglicht es, eine vollständig formatierte E-Mail-Nachricht direkt in einen IMAP-Ordner zu schreiben, ohne sie tatsächlich zu versenden. Dies ist besonders nützlich, um gesendete Nachrichten im Sent-Ordner zu speichern, E-Mails zu archivieren oder Test-Nachrichten in einem Postfach anzulegen.

Die Nachricht muss als vollständiger RFC-2822-konformer String übergeben werden, inklusive aller Header-Zeilen (z. B. From:, To:, Subject:) und einem Leerzeile-Trenner vor dem eigentlichen Nachrichtentext. Es obliegt dem Aufrufer, die korrekte Formatierung sicherzustellen.

Über den optionalen Parameter options können IMAP-Flags gesetzt werden (z. B. \Seen, \Flagged), die der Nachricht direkt beim Anhängen zugewiesen werden. Der Parameter internal_date erlaubt es, das interne Datum der Nachricht im Format d-M-Y H:i:s O manuell festzulegen, was beim Importieren älterer E-Mails hilfreich ist.

Die Funktion gehört zur IMAP-Erweiterung (ext-imap) und erfordert eine zuvor mit imap_open() geöffnete Verbindung. Ab PHP 8.1 wird der Verbindungsparameter als IMAP\Connection-Objekt statt als resource erwartet.

Parameter

Name Typ Default Beschreibung
$imap Pflicht IMAP\Connection Eine aktive IMAP-Verbindung, die zuvor mit imap_open() geöffnet wurde.
$folder Pflicht string Der vollständige Postfach-Pfad im IMAP-Format, z. B. {mail.example.com}Sent oder {mail.example.com:993/imap/ssl}INBOX.Sent.
$message Pflicht string Die vollständig formatierte E-Mail als RFC-2822-konformer String, inklusive Header und Nachrichtentext, getrennt durch eine Leerzeile.
$options ?string null Optionale IMAP-Flags als String, z. B. \\Seen oder \\Seen \\Flagged, die der Nachricht beim Anhängen gesetzt werden.
$internal_date ?string null Optionales internes Datum der Nachricht im Format d-M-Y H:i:s O, z. B. 01-Jan-2024 12:00:00 +0100. Wird null übergeben, verwendet der Server das aktuelle Datum.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Nachricht erfolgreich angehängt wurde, andernfalls false. Im Fehlerfall kann imap_last_error() für Details abgefragt werden.

Beispiele

Gesendete E-Mail im Sent-Ordner speichern

<?php
$imap = imap_open('{mail.example.com:993/imap/ssl}', 'user@example.com', 'geheim');

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

// RFC-2822-konforme Nachricht zusammenbauen
$message  = "From: Absender <user@example.com>\r\n";
$message .= "To: Empfaenger <empfaenger@example.com>\r\n";
$message .= "Subject: Testmail\r\n";
$message .= "Date: " . date('r') . "\r\n";
$message .= "MIME-Version: 1.0\r\n";
$message .= "Content-Type: text/plain; charset=UTF-8\r\n";
$message .= "\r\n";
$message .= "Hallo, das ist eine Testnachricht.\r\n";

$folder = '{mail.example.com:993/imap/ssl}Sent';

if (imap_append($imap, $folder, $message, '\\Seen')) {
    echo 'Nachricht erfolgreich im Sent-Ordner gespeichert.';
} else {
    echo 'Fehler: ' . imap_last_error();
}

imap_close($imap);
Nachricht erfolgreich im Sent-Ordner gespeichert.

E-Mail mit historischem Datum archivieren

<?php
$imap = imap_open('{mail.example.com:993/imap/ssl}INBOX.Archiv', 'user@example.com', 'geheim');

$message  = "From: Archiv <archiv@example.com>\r\n";
$message .= "To: user@example.com\r\n";
$message .= "Subject: Archivierte Nachricht\r\n";
$message .= "Date: Mon, 01 Jan 2024 10:00:00 +0100\r\n";
$message .= "MIME-Version: 1.0\r\n";
$message .= "Content-Type: text/plain; charset=UTF-8\r\n";
$message .= "\r\n";
$message .= "Dieser Text wurde nachtraeglich archiviert.\r\n";

// Historisches internes Datum setzen
$internalDate = '01-Jan-2024 10:00:00 +0100';

$folder = '{mail.example.com:993/imap/ssl}INBOX.Archiv';

$result = imap_append($imap, $folder, $message, '\\Seen', $internalDate);

if ($result) {
    echo 'Archiviert mit Originaldatum.';
} else {
    echo 'Fehler: ' . imap_last_error();
}

imap_close($imap);
Archiviert mit Originaldatum.

// Wichtig · Fallstricke

Zeilenenden: IMAP erwartet zwingend \r\n (CRLF) als Zeilenumbruch in der Nachricht. Bei Verwendung von nur \n kann es zu Fehlfunktionen oder abgelehnten Nachrichten kommen.

Leerzeile zwischen Header und Body: Zwischen dem letzten Header und dem Nachrichtentext muss eine Leerzeile (\r\n\r\n) stehen. Fehlt diese, wird der Body als weiterer Header interpretiert.

Header-Injection: Werden Benutzereingaben in Header-Felder wie Subject: oder To: eingebettet, müssen diese sorgfältig validiert und bereinigt werden, um Header-Injection-Angriffe zu verhindern. Niemals rohe Benutzerdaten direkt in den Nachrichten-String einfügen.

Zeichenkodierung: Nicht-ASCII-Zeichen in Headern (z. B. im Betreff) müssen gemäß RFC 2047 kodiert werden, z. B. mit mb_encode_mimeheader().