(PHP 4, PHP 5, PHP 7, PHP 8)
imap_append — Añade un mensaje en un buzón de correo
$imap,$folder,$message,$options = null ,$internal_date = null
Añade un message al folder especificado.
imapUna instancia de IMAP\Connection .
folderEl nombre del buzón de correo, ver la documentación de la función imap_open() para más información
Pasar datos no confiables a este parámetro es inseguro, a menos que imap.enable_insecure_rsh esté desactivado.
messageEl 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_dateSi 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.
| Versión | Descripción |
|---|---|
| 8.1.0 |
El parámetro imap ahora espera una instancia de IMAP\Connection
; anteriormente, se esperaba un resource imap válido.
|
| 8.0.0 |
options y internal_date ahora son nullables.
|
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);
?>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 :-0The date format string to use when creating $internal_date is 'd-M-Y H:i:s O'.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");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.