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