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 :-0imap_append
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
imap_append
Референца за `function.imap-append.php` со подобрена типографија и навигација.
imap_append
(PHP 4, PHP 5, PHP 7, PHP 8)
imap_append — Додај порака од стринг во одредено сандаче
= NULL
IMAP\Connection
$imap,string
$folder,string
$message,?string
$options = null,?string
$internal_date = null): bool
Додава стринг message во избраното folder.
Параметри
-
imap Еден IMAP\Connection instance.
folder-
Креира нов сандаче специфициран од imap_open() за повеќе информации
Ги ескејпува специјалните знаци во стринг за употреба во SQL изјаваПроследувањето на недоверливи податоци на овој параметар е insecure, освен ако imap.enable_insecure_rsh е оневозможено.
message-
Пораката што треба да се додаде, како стринг
Кога разговарате со Cyrus IMAP серверот, мора да користите "\r\n" како терминатор на крајот од линијата наместо "\n" или операцијата ќе пропадне
options-
Ако е обезбедено,
optionsисто така ќе биде запишано воfolder internal_date-
Ако овој параметар е поставен, тој ќе го постави INTERNALDATE на додадената порака. Параметарот треба да биде стринг со датум што е во согласност со спецификациите на rfc2060 за вредност на date_time.
Вратени вредности
Патеката до PHP скриптата што треба да се провери. true на успех или false при неуспех.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.1.0 |
На imap параметарот очекува IMAP\Connection
инстанца сега; претходно, валидна imap resource се очекуваше.
|
| 8.0.0 |
options and internal_date се сега null.
|
Примери
Пример #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: [email protected]\r\n"
. "To: [email protected]\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 белешки
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.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");The date format string to use when creating $internal_date is 'd-M-Y H:i:s O'.