// rewrap the body to clean up quotations and line lengths
sqBodyWrap($body, $editor_size);
$composeMessage = getAttachments($message, $composeMessage, $passed_id, $entities, $imapConnection);
+ if (!empty($orig_header->x_sm_flag_reply))
+ $composeMessage->rfc822_header->more_headers['X-SM-Flag-Reply'] = $orig_header->x_sm_flag_reply;
//TODO: completely unclear if should be using $compose_session instead of $session below
$compose_messages[$session] = $composeMessage;
sqsession_register($compose_messages,'compose_messages');
//$temp = array(&$composeMessage, &$draft);
//do_hook('compose_send', $temp);
+ // remove special header if present and prepare to mark
+ // a message that a draft was composed in reply to
+ if (!empty($composeMessage->rfc822_header->x_sm_flag_reply) && !$draft) {
+ global $passed_id, $mailbox;
+ // tricks the code below that marks the reply
+ list($action, $passed_id, $mailbox) = explode('::', $rfc822_header->x_sm_flag_reply, 3);
+ unset($composeMessage->rfc822_header->x_sm_flag_reply);
+ unset($composeMessage->rfc822_header->more_headers['X-SM-Flag-Reply']);
+ }
+
if (!$useSendmail && !$draft) {
require_once(SM_PATH . 'class/deliver/Deliver_SMTP.class.php');
$deliver = new Deliver_SMTP();
$imap_stream = sqimap_login($username, false, $imapServerAddress,
$imapPort, 0, $imap_stream_options);
if (sqimap_mailbox_exists ($imap_stream, $draft_folder)) {
+//TODO: this can leak private information about folders and message IDs if messages are accessed/sent from another client --- should this feature be optional?
+ // make note of the message to mark as having been replied to
+ global $passed_id, $mailbox;
+ if ($action == 'reply' || $action == 'reply_all' || $action == 'forward' || $action == 'forward_as_attachment') {
+ $composeMessage->rfc822_header->more_headers['X-SM-Flag-Reply'] = $action . '::' . $passed_id . '::' . $mailbox;
+ }
+
require_once(SM_PATH . 'class/deliver/Deliver_IMAP.class.php');
$imap_deliver = new Deliver_IMAP();
$success = $imap_deliver->mail($composeMessage, $imap_stream, $reply_id, $reply_ent_id, $imap_stream, $draft_folder);
if ($action=='reply' || $action=='reply_all' || $action=='forward' || $action=='forward_as_attachment') {
require(SM_PATH . 'functions/mailbox_display.php');
- $aMailbox = sqm_api_mailbox_select($imap_stream, $iAccount, $mailbox,array('setindex' => $what, 'offset' => $startMessage),array());
- switch($action) {
- case 'reply':
- case 'reply_all':
- // check if we are allowed to set the \\Answered flag
- if (in_array('\\answered',$aMailbox['PERMANENTFLAGS'], true)) {
- $aUpdatedMsgs = sqimap_toggle_flag($imap_stream, array($passed_id), '\\Answered', true, false);
- if (isset($aUpdatedMsgs[$passed_id]['FLAGS'])) {
- /**
- * Only update the cached headers if the header is
- * cached.
- */
- if (isset($aMailbox['MSG_HEADERS'][$passed_id])) {
- $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'] = $aMsg['FLAGS'];
+ // select errors here could be due to a draft reply being sent
+ // after the original message's mailbox is moved or deleted
+ $aMailbox = sqm_api_mailbox_select($imap_stream, $iAccount, $mailbox,array('setindex' => $what, 'offset' => $startMessage),array(), false);
+ // a non-empty return from above means we can proceed
+ if (!empty($aMailbox)) {
+ switch($action) {
+ case 'reply':
+ case 'reply_all':
+ // check if we are allowed to set the \\Answered flag
+ if (in_array('\\answered',$aMailbox['PERMANENTFLAGS'], true)) {
+ $aUpdatedMsgs = sqimap_toggle_flag($imap_stream, array($passed_id), '\\Answered', true, false);
+ if (isset($aUpdatedMsgs[$passed_id]['FLAGS'])) {
+ /**
+ * Only update the cached headers if the header is
+ * cached.
+ */
+ if (isset($aMailbox['MSG_HEADERS'][$passed_id])) {
+ $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'] = $aMsg['FLAGS'];
+ }
}
}
- }
- break;
- case 'forward':
- case 'forward_as_attachment':
- // check if we are allowed to set the $Forwarded flag (RFC 4550 paragraph 2.8)
- if (in_array('$forwarded',$aMailbox['PERMANENTFLAGS'], true) ||
- in_array('\\*',$aMailbox['PERMANENTFLAGS'])) {
-
- // 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);
+ break;
+ case 'forward':
+ case 'forward_as_attachment':
+ // check if we are allowed to set the $Forwarded flag (RFC 4550 paragraph 2.8)
+ if (in_array('$forwarded',$aMailbox['PERMANENTFLAGS'], true) ||
+ in_array('\\*',$aMailbox['PERMANENTFLAGS'])) {
+
+ // 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);
+ $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'];
+ foreach ($ids as $id) {
+ if (isset($aUpdatedMsgs[$id]['FLAGS'])) {
+ if (isset($aMailbox['MSG_HEADERS'][$id])) {
+ $aMailbox['MSG_HEADERS'][$id]['FLAGS'] = $aMsg['FLAGS'];
+ }
}
}
}
+ break;
}
- break;
- }
- /**
- * Write mailbox with updated seen flag information back to cache.
- */
- if(isset($aUpdatedMsgs[$passed_id])) {
- $mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] = $aMailbox;
- sqsession_register($mailbox_cache,'mailbox_cache');
+ /**
+ * Write mailbox with updated seen flag information back to cache.
+ */
+ if(isset($aUpdatedMsgs[$passed_id])) {
+ $mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] = $aMailbox;
+ sqsession_register($mailbox_cache,'mailbox_cache');
+ }
}
-
}