imap_append
(PHP 4, PHP 5, PHP 7, PHP 8)
imap_append — Append a string message to a specified mailbox
说明
IMAP\Connection
$imap,string
$folder,string
$message,?string
$options = null,?string
$internal_date = null): bool
   Appends a string message to the specified folder. 
  
参数
- 
imap
- IMAP\Connection 实例。 
- folder
- 
      The mailbox name, see imap_open() for more information 警告Passing untrusted data to this parameter is insecure, unless imap.enable_insecure_rsh is disabled. 
- message
- 
      The message to be append, as a string When talking to the Cyrus IMAP server, you must use "\r\n" as your end-of-line terminator instead of "\n" or the operation will fail 
- options
- 
      If provided, the optionswill also be written to thefolder
- internal_date
- 
      If this parameter is set, it will set the INTERNALDATE on the appended message. The parameter should be a date string that conforms to the rfc2060 specifications for a date_time value. 
更新日志
| 版本 | 说明 | 
|---|---|
| 8.1.0 | 现在 imap参数接受 IMAP\Connection
  实例,之前接受有效的imapresource。 | 
| 8.0.0 | optionsandinternal_dateare now nullable. | 
示例
示例 #1 imap_append() example
<?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"
. "this is a test message, please ignore\r\n"
);
$check = imap_check($imap);
echo "Msg Count after append : ". $check->Nmsgs . "\n";
imap_close($imap);
?>用户贡献的备注 4 notes
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 :-0You 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");The date format string to use when creating $internal_date is 'd-M-Y H:i:s O'.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.