Stop using session_unregister()
[squirrelmail.git] / src / compose.php
index 619fc70869ccedfc37ccf9482f3402ec5ba6634c..1b8dfd7340b4960606ec4e4a4165c7269d6a69f1 100644 (file)
@@ -10,7 +10,7 @@
  *    - Send mail
  *    - Save As Draft
  *
- * @copyright © 1999-2007 The SquirrelMail Project Team
+ * @copyright © 1999-2009 The SquirrelMail Project Team
  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  * @version $Id$
  * @package squirrelmail
@@ -60,7 +60,9 @@ sqsession_unregister('compose_messages');
 $oErrorHandler->setDelayedErrors(true);
 
 /** SESSION/POST/GET VARS */
-sqgetGlobalVar('send', $send, SQ_POST);
+sqgetGlobalVar('send_button_count', $send_button_count, SQ_POST, 1, SQ_TYPE_INT);
+for ($i = 1; $i <= $send_button_count; $i++)
+   if (sqgetGlobalVar('send' . $i, $send, SQ_POST)) break;
 // Send can only be achieved by setting $_POST var. If Send = true then
 // retrieve other form fields from $_POST
 if (isset($send) && $send) {
@@ -83,8 +85,9 @@ sqgetGlobalVar('request_mdn',$request_mdn, $SQ_GLOBAL);
 sqgetGlobalVar('request_dr',$request_dr, $SQ_GLOBAL);
 sqgetGlobalVar('html_addr_search',$html_addr_search, $SQ_GLOBAL);
 sqgetGlobalVar('mail_sent',$mail_sent, $SQ_GLOBAL);
-sqgetGlobalVar('passed_id',$passed_id, $SQ_GLOBAL);
+sqgetGlobalVar('passed_id',$passed_id, $SQ_GLOBAL, NULL, SQ_TYPE_BIGINT);
 sqgetGlobalVar('passed_ent_id',$passed_ent_id, $SQ_GLOBAL);
+sqgetGlobalVar('fwduid',$fwduid, $SQ_GLOBAL, '');
 
 sqgetGlobalVar('attach',$attach, SQ_POST);
 sqgetGlobalVar('draft',$draft, SQ_POST);
@@ -154,7 +157,7 @@ if ( sqgetGlobalVar('mailtodata', $mailtodata, SQ_GET) ) {
     unset($mailtodata,$mtdata, $trtable);
 }
 
-/* Location (For HTTP 1.1 Header("Location: ...") redirects) */
+/* Location (For HTTP 1.1 header("Location: ...") redirects) */
 $location = get_location();
 /* Identities (fetch only once) */
 $idents = get_identities();
@@ -237,9 +240,7 @@ function getReplyCitation($orig_from, $orig_date) {
     /* Otherwise, try to select the desired citation style. */
     switch ($reply_citation_style) {
     case 'author_said':
-        /**
-         * To translators: %s is for author's name
-         */
+        // i18n: %s is for author's name
         $full_reply_citation = sprintf(_("%s wrote:"),$sOrig_from);
         break;
     case 'quote_who':
@@ -248,15 +249,14 @@ function getReplyCitation($orig_from, $orig_date) {
         $full_reply_citation = $start . $sOrig_from . $end;
         break;
     case 'date_time_author':
-        /**
-         * To translators:
-         *  first %s is for date string, second %s is for author's name. Date uses
-         *  formating from "D, F j, Y g:i a" and "D, F j, Y H:i" translations.
-         * Example string:
-         *  "On Sat, December 24, 2004 23:59, Santa wrote:"
-         * If you have to put author's name in front of date string, check comments about
-         * argument swapping at http://www.php.net/sprintf
-         */
+        // i18n:
+        // The first %s is for date string, the second %s is for author's name.
+        // The date uses formating from "D, F j, Y g:i a" and "D, F j, Y H:i"
+        // translations.
+        // Example string:
+        // "On Sat, December 24, 2004 23:59, Santa wrote:"
+        // If you have to put author's name in front of date string, check comments about
+        // argument swapping at http://php.net/sprintf
         $full_reply_citation = sprintf(_("On %s, %s wrote:"), getLongDateString($orig_date), $sOrig_from);
         break;
     case 'user-defined':
@@ -337,7 +337,7 @@ if (sqsession_is_registered('session_expired_post')) {
             'subject', 'newmail', 'send_to_bcc', 'passed_id', 'mailbox', 
             'from_htmladdr_search', 'identity', 'draft_id', 'delete_draft', 
             'mailprio', 'edit_as_new', 'attachments', 'composesession', 
-            'request_mdn', 'request_dr');
+            'request_mdn', 'request_dr', 'fwduid');
 
         foreach ($compo_var_list as $var) {
             if ( isset($session_expired_post[$var]) && !isset($$var) ) {
@@ -366,11 +366,11 @@ if (sqsession_is_registered('session_expired_post')) {
     } else {
         $sHeaderJs = (isset($sHeaderJs)) ? $sHeaderJs : '';
         if (strpos($action, 'reply') !== false && $reply_focus) {
-            $sBodyTagJs = 'onload="checkForm(\''.$replyfocus.'\');"';
+            $sOnload = 'checkForm(\''.$replyfocus.'\');';
         } else {
-            $sBodyTagJs = 'onload="checkForm();"';
+            $sOnload = 'checkForm();';
         }
-        displayPageHeader($color, $mailbox,$sHeaderJs,$sBodyTagJs);
+        displayPageHeader($color, $mailbox,$sHeaderJs,$sOnload);
     }
     showInputForm($session, false);
     exit();
@@ -441,7 +441,7 @@ if ($draft) {
 
         if ($compose_new_win == '1') {
             if ( !isset($pageheader_sent) || !$pageheader_sent ) {
-                Header("Location: $location/compose.php?saved_draft=yes&session=$composesession");
+                header("Location: $location/compose.php?saved_draft=yes&session=$composesession");
             } else {
 //FIXME: DON'T ECHO HTML FROM CORE!
                 echo '   <br><br><div style="text-align: center;"><a href="' . $location
@@ -451,7 +451,7 @@ if ($draft) {
             exit();
         } else {
             if ( !isset($pageheader_sent) || !$pageheader_sent ) {
-                Header("Location: $location/right_main.php?mailbox=" . urlencode($draft_folder) .
+                header("Location: $location/right_main.php?mailbox=" . urlencode($draft_folder) .
                    "&startMessage=1&note=".urlencode($draft_message));
             } else {
 //FIXME: DON'T ECHO HTML FROM CORE!
@@ -522,7 +522,8 @@ if ($send) {
         // NOTE: this hook changed in 1.5.2 from sending $Result and
         //       $composeMessage as args #2 and #3 to being in an array
         //       under arg #2
-        do_hook('compose_send_after', $temp=array(&$Result, &$composeMessage, &$mail_sent));
+        $temp = array(&$Result, &$composeMessage, &$mail_sent);
+        do_hook('compose_send_after', $temp);
         if (! $Result) {
             showInputForm($session);
             exit();
@@ -549,7 +550,7 @@ if ($send) {
 
         if ($compose_new_win == '1') {
             if ( !isset($pageheader_sent) || !$pageheader_sent ) {
-                Header("Location: $location/compose.php?mail_sent=$mail_sent");
+                header("Location: $location/compose.php?mail_sent=$mail_sent");
             } else {
 //FIXME: DON'T ECHO HTML FROM CORE!
                 echo '   <br><br><div style="text-align: center;"><a href="' . $location
@@ -559,7 +560,7 @@ if ($send) {
             exit();
         } else {
             if ( !isset($pageheader_sent) || !$pageheader_sent ) {
-                Header("Location: $location/right_main.php?mailbox=$urlMailbox".
+                header("Location: $location/right_main.php?mailbox=$urlMailbox".
                     "&startMessage=$startMessage&mail_sent=$mail_sent");
             } else {
 //FIXME: DON'T ECHO HTML FROM CORE!
@@ -661,6 +662,8 @@ elseif (isset($sigappend)) {
         foreach($delete as $index) {
             if (!empty($composeMessage->entities) && isset($composeMessage->entities[$index])) {
                 $composeMessage->entities[$index]->purgeAttachments();
+                // FIXME: one person reported that unset() didn't do anything at all here, so this is a work-around... but it triggers PHP notices if the unset() doesn't work, which should be fixed... but bigger question is if unset() doesn't work here, what about everywhere else? Anyway, uncomment this if you think you need it
+                //$composeMessage->entities[$index] = NULL;
                 unset ($composeMessage->entities[$index]);
             }
         }
@@ -847,7 +850,8 @@ function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $se
                 $enc_from_name = '"'.$data['full_name'].'" <'. $data['email_address'].'>';
                 if(strtolower($enc_from_name) == strtolower($orig_from)) {
                     $identity = $nr;
-                    break;
+                    // don't stop!  need to build $identities array for idents match below
+                    //break;
                 }
                 $identities[] = $enc_from_name;
             }
@@ -877,6 +881,7 @@ function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $se
                 $request_dr = $mdn_user_support && !empty($orig_header->drnt) ? '1' : '0';
 
                 /* remember the references and in-reply-to headers in case of an reply */
+//FIXME: it would be better to fiddle with headers inside of the message object or possibly when delivering the message to its destination (drafts folder?); is this possible?
                 $composeMessage->rfc822_header->more_headers['References'] = $orig_header->references;
                 $composeMessage->rfc822_header->more_headers['In-Reply-To'] = $orig_header->in_reply_to;
                 // rewrap the body to clean up quotations and line lengths
@@ -1002,7 +1007,7 @@ function getAttachments($message, &$composeMessage, $passed_id, $entities, $imap
                         if ($filename == "") {
                             $filename = "untitled-".$message->entity_id;
                         }
-                        $filename .= '.msg';
+                        $filename .= '.eml';
                     } else {
                         $filename = $message->getFilename();
                     }
@@ -1065,7 +1070,7 @@ function getMessage_RFC822_Attachment($message, $composeMessage, $passed_id,
         $fp = fopen($hashed_attachment_dir . '/' . $localfilename, 'wb');
         fwrite ($fp, $body);
         fclose($fp);
-        $composeMessage->initAttachment('message/rfc822',$subject.'.msg',
+        $composeMessage->initAttachment('message/rfc822',$subject.'.eml',
                 $localfilename);
     }
     return $composeMessage;
@@ -1076,7 +1081,7 @@ function showInputForm ($session, $values=false) {
         $body, $startMessage, $action, $attachments,
         $use_signature, $signature, $prefix_sig, $session_expired,
         $editor_size, $editor_height, $subject, $newmail,
-        $use_javascript_addr_book, $passed_id, $mailbox,
+        $use_javascript_addr_book, $passed_id, $mailbox, $fwduid,
         $from_htmladdr_search, $location_of_buttons, $attachment_dir,
         $username, $data_dir, $identity, $idents, $delete_draft,
         $mailprio, $compose_new_win, $saved_draft, $mail_sent, $sig_first,
@@ -1178,6 +1183,11 @@ function showInputForm ($session, $values=false) {
         echo addHidden('passed_id', $passed_id);
     }
 
+    if (isset($fwduid)) {
+//FIXME: DON'T ECHO HTML FROM CORE!
+        echo addHidden('fwduid', $fwduid);
+    }
+
     if ($saved_draft == 'yes') {
         $oTemplate->assign('note', _("Your draft has been saved."));
         $oTemplate->display('note.tpl');
@@ -1212,6 +1222,17 @@ function showInputForm ($session, $values=false) {
     $oTemplate->assign('bcc', htmlspecialchars($send_to_bcc));
     $oTemplate->assign('subject', htmlspecialchars($subject));
 
+    // access keys...
+    //
+    global $accesskey_compose_to, $accesskey_compose_cc,
+           $accesskey_compose_identity, $accesskey_compose_bcc,
+           $accesskey_compose_subject;
+    $oTemplate->assign('accesskey_compose_identity', $accesskey_compose_identity);
+    $oTemplate->assign('accesskey_compose_to', $accesskey_compose_to);
+    $oTemplate->assign('accesskey_compose_cc', $accesskey_compose_cc);
+    $oTemplate->assign('accesskey_compose_bcc', $accesskey_compose_bcc);
+    $oTemplate->assign('accesskey_compose_subject', $accesskey_compose_subject);
+
     $oTemplate->display('compose_header.tpl');
 
     if ($location_of_buttons == 'between') {
@@ -1255,6 +1276,12 @@ function showInputForm ($session, $values=false) {
     $oTemplate->assign('body', $body_str);
     $oTemplate->assign('show_bottom_send', $location_of_buttons!='bottom');
 
+    // access keys...
+    //
+    global $accesskey_compose_body, $accesskey_compose_send;
+    $oTemplate->assign('accesskey_compose_body', $accesskey_compose_body);
+    $oTemplate->assign('accesskey_compose_send', $accesskey_compose_send);
+
     $oTemplate->display ('compose_body.tpl');
 
     if ($location_of_buttons == 'bottom') {
@@ -1311,36 +1338,44 @@ function showInputForm ($session, $values=false) {
         $oTemplate->assign('max_file_size', empty($max) ? -1 : $max);
         $oTemplate->assign('attachments', $attach);
 
+        // access keys...
+        //
+        global $accesskey_compose_attach_browse, $accesskey_compose_attach,
+               $accesskey_compose_delete_attach;
+        $oTemplate->assign('accesskey_compose_attach_browse', $accesskey_compose_attach_browse);
+        $oTemplate->assign('accesskey_compose_attach', $accesskey_compose_attach);
+        $oTemplate->assign('accesskey_compose_delete_attach', $accesskey_compose_delete_attach);
+
         $oTemplate->display('compose_attachments.tpl');
     } // End of file_uploads if-block
     /* End of attachment code */
 
-//FIXME: no direct echoing to browser, no HTML output in core!
-    echo addHidden('username', $username).
-         addHidden('smaction', $action).
-         addHidden('mailbox', $mailbox);
+    $oTemplate->assign('username', $username);
+    $oTemplate->assign('smaction', $action);
+    $oTemplate->assign('mailbox', $mailbox);
     sqgetGlobalVar('QUERY_STRING', $queryString, SQ_SERVER);
-//FIXME: no direct echoing to browser, no HTML output in core!
-    echo addHidden('composesession', $composesession).
-        addHidden('querystring', $queryString).
-        (!empty($attach_array) ?
-         addHidden('attachments', urlencode(serialize($attach_array))) : '').
-        "</form>\n";
+    $oTemplate->assign('querystring', $queryString);
+    $oTemplate->assign('composesession', $composesession);
+    $oTemplate->assign('send_button_count', unique_widget_name('send', TRUE));
+    if (!empty($attach_array))
+        $oTemplate->assign('attachments', urlencode(serialize($attach_array)));
+
+    $aUserNotices = array();
+
+    // File uploads are off, so we didn't show that part of the form.
+    // To avoid bogus bug reports, tell the user why. 
     if (!(bool) ini_get('file_uploads')) {
-        /* File uploads are off, so we didn't show that part of the form.
-           To avoid bogus bug reports, tell the user why. */
-//FIXME: no direct echoing to browser, no HTML output in core!
-        echo '<p style="text-align:center">'
-            . _("Because PHP file uploads are turned off, you can not attach files to this message. Please see your system administrator for details.")
-            . "</p>\r\n";
+        $aUserNotices[] = _("Because PHP file uploads are turned off, you can not attach files to this message. Please see your system administrator for details.");
     }
 
+    $oTemplate->assign('user_notices', $aUserNotices);
+
+    $oTemplate->display('compose_form_close.tpl');
+
     if ($compose_new_win=='1') {
         $oTemplate->display('compose_newwin_close.tpl');
     }
 
-    do_hook('compose_bottom', $null);
-
     $oErrorHandler->setDelayedErrors(false);
     $oTemplate->display('footer.tpl');
 }
@@ -1364,10 +1399,16 @@ function showComposeButtonRow() {
 
     $mdn_user_support=getPref($data_dir, $username, 'mdn_user_support',$default_use_mdn);
 
+    $address_book_button_attribs = array();
+    global $accesskey_compose_addresses;
+    if ($accesskey_compose_addresses != 'NONE')
+        $address_book_button_attribs['accesskey'] = $accesskey_compose_addresses;
     if ($use_javascript_addr_book && checkForJavascript()) {
-        $addr_book = addButton(_("Addresses"), null, array('onclick' => 'javascript:open_abook();'));
+        $addr_book = addButton(_("Addresses"),
+                               null,
+                               array_merge($address_book_button_attribs, array('onclick' => 'javascript:open_abook();')));
     } else {
-        $addr_book = addSubmit(_("Addresses"), 'html_addr_search');
+        $addr_book = addSubmit(_("Addresses"), 'html_addr_search', $address_book_button_attribs);
     }
 
     $oTemplate->assign('allow_priority', $default_use_priority==1);
@@ -1381,6 +1422,18 @@ function showComposeButtonRow() {
     $oTemplate->assign('drafts_enabled', $save_as_draft);
     $oTemplate->assign('address_book_button', $addr_book);
 
+    // access keys...
+    //
+    global $accesskey_compose_priority, $accesskey_compose_on_read,
+           $accesskey_compose_on_delivery, $accesskey_compose_signature,
+           $accesskey_compose_save_draft, $accesskey_compose_send;
+    $oTemplate->assign('accesskey_compose_priority', $accesskey_compose_priority);
+    $oTemplate->assign('accesskey_compose_on_read', $accesskey_compose_on_read);
+    $oTemplate->assign('accesskey_compose_on_delivery', $accesskey_compose_on_delivery);
+    $oTemplate->assign('accesskey_compose_signature', $accesskey_compose_signature);
+    $oTemplate->assign('accesskey_compose_save_draft', $accesskey_compose_save_draft);
+    $oTemplate->assign('accesskey_compose_send', $accesskey_compose_send);
+
     $oTemplate->display('compose_buttons.tpl');
 }
 
@@ -1467,8 +1520,18 @@ function getByteSize($ini_size) {
  * In the future the responsible backend should be automaticly loaded
  * and conf.pl should show a list of available backends.
  * The message also should be constructed by the message class.
+ *
+ * @param object $composeMessage The message being sent.  Please note
+ *                               that it is passed by reference and
+ *                               will be returned modified, with additional
+ *                               headers, such as Message-ID, Date, In-Reply-To,
+ *                               References, and so forth.
+ *
+ * @return boolean FALSE if delivery failed, or some non-FALSE value
+ *                 upon success.
+ *
  */
-function deliverMessage($composeMessage, $draft=false) {
+function deliverMessage(&$composeMessage, $draft=false) {
     global $send_to, $send_to_cc, $send_to_bcc, $mailprio, $subject, $body,
         $username, $identity, $idents, $data_dir,
         $request_mdn, $request_dr, $default_charset, $useSendmail,
@@ -1511,8 +1574,9 @@ function deliverMessage($composeMessage, $draft=false) {
     }
 
     /* Receipt: On Delivery */
-    if (isset($request_dr) && $request_dr) {
-        $rfc822_header->more_headers['Return-Receipt-To'] = $from->mailbox.'@'.$from->domain;
+    if (!empty($request_dr)) {
+//FIXME: it would be better to fiddle with headers inside of the message object or possibly when delivering the message to its destination; is this possible?
+        $rfc822_header->more_headers['Return-Receipt-To'] = $from_addr;
     } elseif (isset($rfc822_header->more_headers['Return-Receipt-To'])) {
         unset($rfc822_header->more_headers['Return-Receipt-To']);
     }
@@ -1567,12 +1631,13 @@ function deliverMessage($composeMessage, $draft=false) {
     if (!$useSendmail && !$draft) {
         require_once(SM_PATH . 'class/deliver/Deliver_SMTP.class.php');
         $deliver = new Deliver_SMTP();
-        global $smtpServerAddress, $smtpPort, $pop_before_smtp;
+        global $smtpServerAddress, $smtpPort, $pop_before_smtp, $pop_before_smtp_host;
 
         $authPop = (isset($pop_before_smtp) && $pop_before_smtp) ? true : false;
+        if (empty($pop_before_smtp_host)) $pop_before_smtp_host = $smtpServerAddress;
         get_smtp_user($user, $pass);
         $stream = $deliver->initStream($composeMessage,$domain,0,
-                $smtpServerAddress, $smtpPort, $user, $pass, $authPop);
+                $smtpServerAddress, $smtpPort, $user, $pass, $authPop, $pop_before_smtp_host);
     } elseif (!$draft) {
         require_once(SM_PATH . 'class/deliver/Deliver_SendMail.class.php');
         global $sendmail_path, $sendmail_args;
@@ -1588,20 +1653,16 @@ function deliverMessage($composeMessage, $draft=false) {
         $stream = $deliver->initStream($composeMessage,$sendmail_path);
     } elseif ($draft) {
         global $draft_folder;
-        require_once(SM_PATH . 'class/deliver/Deliver_IMAP.class.php');
         $imap_stream = sqimap_login($username, false, $imapServerAddress,
                 $imapPort, 0);
         if (sqimap_mailbox_exists ($imap_stream, $draft_folder)) {
             require_once(SM_PATH . 'class/deliver/Deliver_IMAP.class.php');
             $imap_deliver = new Deliver_IMAP();
-            $length = $imap_deliver->mail($composeMessage, 0, $reply_id, $reply_ent_id);
-            sqimap_append ($imap_stream, $draft_folder, $length);
-            $imap_deliver->mail($composeMessage, $imap_stream, $reply_id, $reply_ent_id);
-            sqimap_append_done ($imap_stream, $draft_folder);
+            $success = $imap_deliver->mail($composeMessage, $imap_stream, $reply_id, $reply_ent_id, $imap_stream, $draft_folder);
             sqimap_logout($imap_stream);
             unset ($imap_deliver);
             $composeMessage->purgeAttachments();
-            return $length;
+            return $success;
         } else {
             $msg  = '<br />'.sprintf(_("Error: Draft folder %s does not exist."), htmlspecialchars($draft_folder));
             plain_error_message($msg);
@@ -1610,7 +1671,7 @@ function deliverMessage($composeMessage, $draft=false) {
     }
     $success = false;
     if ($stream) {
-        $length = $deliver->mail($composeMessage, $stream, $reply_id, $reply_ent_id);
+        $deliver->mail($composeMessage, $stream, $reply_id, $reply_ent_id);
         $success = $deliver->finalizeStream($stream);
     }
     if (!$success) {
@@ -1632,7 +1693,7 @@ function deliverMessage($composeMessage, $draft=false) {
 
         // mark as replied or forwarded if applicable
         //
-        global $what, $iAccount, $startMessage, $passed_id, $mailbox;
+        global $what, $iAccount, $startMessage, $passed_id, $fwduid, $mailbox;
 
         if ($action=='reply' || $action=='reply_all' || $action=='forward' || $action=='forward_as_attachment') {
             require(SM_PATH . 'functions/mailbox_display.php');
@@ -1660,10 +1721,22 @@ function deliverMessage($composeMessage, $draft=false) {
                 if (in_array('$forwarded',$aMailbox['PERMANENTFLAGS'], true) ||
                     in_array('\\*',$aMailbox['PERMANENTFLAGS'])) {
 
-                    $aUpdatedMsgs = sqimap_toggle_flag($imap_stream, array($passed_id), '$Forwarded', true, false);
-                    if (isset($aUpdatedMsgs[$passed_id]['FLAGS'])) {
-                        if (isset($aMailbox['MSG_HEADERS'][$passed_id])) {
-                            $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'] = $aMsg['FLAGS'];
+                    // when forwarding as an attachment from the message
+                    // list, passed_id is not used, need to get UID(s)
+                    // from the query string
+                    //
+                    if (empty($passed_id) && !empty($fwduid))
+                        $ids = explode('_', $fwduid);
+                    else
+                        $ids = array($passed_id);
+
+                    $aUpdatedMsgs = sqimap_toggle_flag($imap_stream, $ids, '$Forwarded', true, false);
+
+                    foreach ($ids as $id) {
+                        if (isset($aUpdatedMsgs[$id]['FLAGS'])) {
+                            if (isset($aMailbox['MSG_HEADERS'][$id])) {
+                                $aMailbox['MSG_HEADERS'][$id]['FLAGS'] = $aMsg['FLAGS'];
+                            }
                         }
                     }
                 }
@@ -1710,11 +1783,9 @@ function deliverMessage($composeMessage, $draft=false) {
                     $sent_folder = $mailbox;
                 }
             }
-            sqimap_append ($imap_stream, $sent_folder, $length);
             require_once(SM_PATH . 'class/deliver/Deliver_IMAP.class.php');
             $imap_deliver = new Deliver_IMAP();
-            $imap_deliver->mail($composeMessage, $imap_stream, $reply_id, $reply_ent_id);
-            sqimap_append_done ($imap_stream, $sent_folder);
+            $imap_deliver->mail($composeMessage, $imap_stream, $reply_id, $reply_ent_id, $imap_stream, $sent_folder);
             unset ($imap_deliver);
         }