Notes; Appending PHPMailer Email to Sent or Any Folder with IMAP

These are my notes for getting ‘imap_append‘ to work with PHPMailer. This is not necessarily the best solution, but here’s mine for those interested.

imap_append

Premise;

I have a script that uses PHPMailer to send out HTML formatted emails with SMTP, through an HTML form. Emails were not saved to the sent folder with this set up, so I wanted to add a feature to append all the sent emails to a specific folder.

Also, append a different email to a second folder if there was an error. And the error message will be left unread while saved email is appended in read state.

Solution;

Change imap server, folder, username & password fields. The folder is probably in the format “{imapserver}folder” (more on that below).

if(!$mail->send()) {
$stream = imap_open("{imap.server.com:993/imap4/ssl/novalidate-cert}", "login", "password");
imap_append($stream, "{imap.server.com}Sent Error"
, "From: custom@email.com\r\n"
. "To: custom@email.com\r\n"
. "Subject: Sent Error\r\n"
. "Content-Type: text/html;\r\n\tcharset=\"utf-8\"\r\n"
. "Content-Transfer-Encoding: 8bit \r\n"
. "\r\n"
. "There has been an error (see below).<br /><br />\r\n"
. "<font color=\"red\">" . $mail->ErrorInfo . "</font>"
. "<br /><br />Message below:<br />\r\n"
. $message
);
imap_close($stream);
} else {
$stream = imap_open("{imap.server.com:993/imap4/ssl/novalidate-cert}", "login", "password");
imap_append($stream, "{imap.server.com}Sent OK"
, "From: custom@email.com\r\n"
. "To: " . $_POST['email'] . "\r\n"
. "Subject: Sent Successfull\r\n"
. "Content-Type: text/html;\r\n\tcharset=\"utf-8\"\r\n"
. "Content-Transfer-Encoding: 8bit \r\n"
. "\r\n"
. $message
, "\Seen"
);
imap_close($stream);
}

PS. Find the different IMAP server connection settings here.

Solved;

Usual advice is something like, “$mail->getSentMIMEMessage()” to get raw message for mail output. But I haven’t used it, on “PHP 5.4.45” I got this error;

Call to undefined method PHPMailer::getSentMIMEMessage()

I wasn’t sure what the correct name of the folder of my email sent folder was, so this was the work around. Create an imap_getmailboxes.php file;

Change imap server, username & password fields.

<?php
 $mbox = imap_open("{imap.server.com}", "username", "password", OP_HALFOPEN)
       or die("can't connect: " . imap_last_error());
$list = imap_getmailboxes($mbox, "{imap.server.com}", "*");
 if (is_array($list)) {
     foreach ($list as $key => $val) {
         echo "($key) ";
         echo imap_utf7_decode($val->name) . ",";
         echo "'" . $val->delimiter . "',";
         echo $val->attributes . "<br />\n";
     }
 } else {
     echo "imap_getmailboxes failed: " . imap_last_error() . "\n";
 }
imap_close($mbox);
 ?>

Run php imap_getmailboxes.php, if you get;

PHP Fatal error: Call to undefined function imap_open() in imap_getmailboxes.php on line 2

For example (will differ depending on PHP version); apt-get install php5-imap

For me Apache was automatically restarted, if not, need to do it manually.

An easy way to check if it’s enabled is, php -m | grep imap

Here’s my example output with imap_getmailboxes;

(0) {mail.exchangemail.hk}archive-2015,'/',64
(1) {mail.exchangemail.hk}Calendar,'/',64
(2) {mail.exchangemail.hk}Contacts,'/',32
(3) {mail.exchangemail.hk}Deleted Items,'/',64
(4) {mail.exchangemail.hk}Drafts,'/',68
(5) {mail.exchangemail.hk}INBOX,'/',68
(6) {mail.exchangemail.hk}Journal,'/',64
(7) {mail.exchangemail.hk}Junk Email,'/',64
(8) {mail.exchangemail.hk}Notes,'/',64
(9) {mail.exchangemail.hk}Outbox,'/',64
(10) {mail.exchangemail.hk}Sent,'/',64
(11) {mail.exchangemail.hk}Sent Items,'/',64
(12) {mail.exchangemail.hk}Tasks,'/',64
(13) {mail.exchangemail.hk}Trash,'/',68

Therefore the correct folder was for example “{mail.exchangemail.hk}Sent”.

And that’s pretty much it.

1 thought on “Notes; Appending PHPMailer Email to Sent or Any Folder with IMAP”

Leave a Comment