PHP Conference Kansai 2025

imap_append

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_appendAñade un mensaje en un buzón de correo

Descripción

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

Añade un message al folder especificado.

Parámetros

imap

An IMAP\Connection instance.

folder

El nombre del buzón de correo, ver la documentación de la función imap_open() para más información

Advertencia

El paso de datos no confiables a este parámetro es inseguro, a menos que imap.enable_insecure_rsh esté inhabilitado.

message

El mensaje a añadir, en forma de string

Al intercambiar con el servidor Cyrus IMAP, se debe utilizar "\r\n" como terminación de línea, en lugar de "\n" o la operación fallará.

options

Si se proporciona, el parámetro options será también escrito en el buzón folder

internal_date

Si se define este parámetro, establecerá los INTERNALDATE en el mensaje adjunto. El parámetro debe ser una cadena de fecha que cumpla con las especificaciones del rfc2060 para un valor date_time.

Valores devueltos

Devuelve true en caso de éxito o false en caso de error.

Historial de cambios

Versión Descripción
8.1.0 The imap parameter expects an IMAP\Connection instance now; previously, a valid imap recurso was expected.
8.0.0 options y internal_date ahora son nullables.

Ejemplos

Ejemplo #1 Ejemplo con imap_append()

<?php
$imap
= imap_open("{imap.example.org}INBOX.Drafts", "username", "password");

$check = imap_check($imap);
echo
"Msg Count before append: ". $check->Nmsgs . "\n";

imap_append($imap, "{imap.example.org}INBOX.Drafts"
, "From: me@example.com\r\n"
. "To: you@example.com\r\n"
. "Subject: test\r\n"
. "\r\n"
. "Este es un mensaje de prueba. Ignórelo.\r\n"
);

$check = imap_check($imap);
echo
"Número de mensajes después de añadir : ". $check->Nmsgs . "\n";

imap_close($imap);
?>

add a note

User Contributed Notes 4 notes

up
19
rixsta at hotmail dot com
12 years ago
Hi,

As we have been struggling with this for some time I wanted to share how we got imap_append working properly with all MIME parts including attachments. If you are sending email and also wish to append the sent message to the Sent Items folder, I cannot think of an easier way to do this, as follows:

1) Use SwiftMailer to send the message via PHP.
$message = Swift_Message::newInstance("Subject goes here");
(then add from, to, body, attachments etc)
$result = $mailer->send($message);

2) When you construct the message in step 1) above save it to a variable as follows:

$msg = $message->toString(); (this creates the full MIME message required for imap_append()!! After this you can call imap_append like this:

imap_append($imap_conn,$mail_box,$msg."\r\n","\\Seen");

I hope this helps the readers, and prevents saves people from doing what we started doing - hand crafting the MIME messages :-0
up
10
Krzysiek
9 years ago
You can use PHPMailer ( https://github.com/PHPMailer/PHPMailer/ ) with imap.

<?php
// after creating content of mail you have to run preSend() - part of send() method
$mail->send();
// and you can get whole raw message with getSentMIMEMessage() method
imap_append($imap, $mailserver.'INBOX.Sent',$mail->getSentMIMEMessage(), "\\Seen");
up
5
kaminski at istori dot com
14 years ago
The date format string to use when creating $internal_date is 'd-M-Y H:i:s O'.
up
1
jab_creations at yahoo dot com
3 months ago
This function is how you take a sent message in your mail shell and place a copy of it in the remote mail server's sent folder.

It is however not intuitive and I struggled for a couple hours so I'm placing these notes here to spare others the aggravation. Some of the errors I encountered:

- Can't append to mailbox with such a name
- Internal date not correctly formatted

The second/folder parameter is not the string you might think it is (e.g. "Sent", "Inbox.Sent", etc). It is the connection information used by imap_open() which doesn't make sense as the connection is already open! Whatever, here is a basic example addressing those three errors:

<?php
$server
= '{mail.example.com:993/ssl/imap}INBOX.Sent';
$mail_connection_folder = imap_open($server, $user, $pass);

if (
$mail_connection)
{
$result = imap_append($mail_connection, $server, $message_string_raw, '\\Seen', date('d-M-Y H:i:s O'));
}
?>

I had been using the PHP Pear Mail extension which did a fantastic job with DMARC, SPF, DKIM, etc. However it's not well maintained and I couldn't figure out if it returns the email message string. The PHPMailer library (https://github.com/PHPMailer/PHPMailer) does return the message string:

<?php
//Skip to key parts:
$result = $mail->send();

if (
$result)
{
$message_string_raw = $mail->getSentMIMEMessage();
}
else {
/*error handling*/}
?>

Hopefully this will spare some folks a lot of aggravation.
To Top