/** * This should go in imap_mailbox.php * @param string $mailbox */ function handleAsSent($mailbox) { global $handleAsSent_result; /* First check if this is the sent or draft folder. */ $handleAsSent_result = isSentMailbox($mailbox) || isDraftMailbox($mailbox); /* Then check the result of the handleAsSent hook. */ do_hook('check_handleAsSent_result', $mailbox); /* And return the result. */ return $handleAsSent_result; }
/** * Defines special mailboxes: given a mailbox name, it checks if this is a * "special" one: INBOX, Trash, Sent or Draft. * * Since 1.2.5 function includes special_mailbox hook.<br> * Since 1.4.3 hook supports more than one plugin. * @param string $box mailbox name * @param boolean $include_subs (since 1.5.2 and 1.4.9) if true, subfolders of * system folders are special. if false, subfolders are not special mailboxes * unless they are tagged as special in 'special_mailbox' hook. * @return boolean * @since 1.2.3 */ function isSpecialMailbox($box, $include_subs = true) { $ret = strtolower($box) == 'inbox' || isTrashMailbox($box, $include_subs) || isSentMailbox($box, $include_subs) || isDraftMailbox($box, $include_subs); if (!$ret) { $ret = boolean_hook_function('special_mailbox', $box, 1); } return $ret; }
function isSpecialMailbox($box) { global $trash_folder, $sent_folder, $draft_folder, $move_to_trash, $move_to_sent, $save_as_draft; $ret = strtolower($box) == 'inbox' || isTrashMailbox($box) || isSentMailbox($box) || isDraftMailbox($box); if (!$ret) { $ret = do_hook_function('special_mailbox', $box); } return $ret; }
/** * Fills mailbox object * * Some code fragments are present in 1.3.0 - 1.4.4. * @param array $mbx_ary * @param $mbxs * @param stream $imap_stream imap connection resource * @return object see mailboxes class * @since 1.5.0 */ function sqimap_fill_mailbox_tree($mbx_ary, $mbxs = false, $imap_stream) { global $data_dir, $username, $list_special_folders_first, $folder_prefix, $trash_folder, $sent_folder, $draft_folder, $move_to_trash, $move_to_sent, $save_as_draft, $delimiter, $imap_server_type; // $special_folders = array ('INBOX', $sent_folder, $draft_folder, $trash_folder); /* create virtual root node */ $mailboxes = new mailboxes(); $mailboxes->is_root = true; $trail_del = false; $start = 0; if (isset($folder_prefix) && $folder_prefix != '') { $start = substr_count($folder_prefix, $delimiter); if (strrpos($folder_prefix, $delimiter) == strlen($folder_prefix) - 1) { $mailboxes->mailboxname_full = substr($folder_prefix, 0, strlen($folder_prefix) - 1); } else { $mailboxes->mailboxname_full = $folder_prefix; $start++; } $mailboxes->mailboxname_sub = $mailboxes->mailboxname_full; } else { $start = 0; } $cnt = count($mbx_ary); for ($i = 0; $i < $cnt; $i++) { if ($mbx_ary[$i]['mbx'] != '') { $mbx = new mailboxes(); $mailbox = $mbx_ary[$i]['mbx']; /* * Set the is_special flag if it concerned a special mailbox. * Used for displaying the special folders on top in the mailbox * tree displaying code. */ $mbx->is_special |= $mbx->is_inbox = strtoupper($mailbox) == 'INBOX'; $mbx->is_special |= $mbx->is_trash = isTrashMailbox($mailbox); $mbx->is_special |= $mbx->is_sent = isSentMailbox($mailbox); $mbx->is_special |= $mbx->is_draft = isDraftMailbox($mailbox); if (!$mbx->is_special) { $mbx->is_special = boolean_hook_function('special_mailbox', $mailbox, 1); } if (isset($mbx_ary[$i]['unseen'])) { $mbx->unseen = $mbx_ary[$i]['unseen']; } if (isset($mbx_ary[$i]['nummessages'])) { $mbx->total = $mbx_ary[$i]['nummessages']; } $mbx->is_noselect = $mbx_ary[$i]['noselect']; $mbx->is_noinferiors = $mbx_ary[$i]['noinferiors']; $r_del_pos = strrpos($mbx_ary[$i]['mbx'], $delimiter); if ($r_del_pos) { $mbx->mailboxname_sub = substr($mbx_ary[$i]['mbx'], $r_del_pos + 1); } else { /* mailbox is root folder */ $mbx->mailboxname_sub = $mbx_ary[$i]['mbx']; } $mbx->mailboxname_full = $mbx_ary[$i]['mbx']; $mailboxes->addMbx($mbx, $delimiter, $start, $list_special_folders_first); } } sqimap_utf7_decode_mbx_tree($mailboxes); sqimap_get_status_mbx_tree($imap_stream, $mailboxes); return $mailboxes; }
function sqimap_fill_mailbox_tree($mbx_ary, $mbxs = false, $imap_stream) { global $data_dir, $username, $list_special_folders_first, $folder_prefix, $trash_folder, $sent_folder, $draft_folder, $move_to_trash, $move_to_sent, $save_as_draft, $delimiter, $imap_server_type; $special_folders = array('INBOX', $sent_folder, $draft_folder, $trash_folder); /* create virtual root node */ $mailboxes = new mailboxes(); $mailboxes->is_root = true; $trail_del = false; $start = 0; if (isset($folder_prefix) && $folder_prefix != '') { $start = substr_count($folder_prefix, $delimiter); if (strrpos($folder_prefix, $delimiter) == strlen($folder_prefix) - 1) { $trail_del = true; $mailboxes->mailboxname_full = substr($folder_prefix, 0, strlen($folder_prefix) - 1); } else { $mailboxes->mailboxname_full = $folder_prefix; $start++; } $mailboxes->mailboxname_sub = $mailboxes->mailboxname_full; } else { $start = 0; } $cnt = count($mbx_ary); for ($i = 0; $i < $cnt; $i++) { if ($mbx_ary[$i]['mbx'] != '') { $mbx = new mailboxes(); $mailbox = $mbx_ary[$i]['mbx']; /* sent subfolders messes up using existing code as subfolders were marked, but the parents were ordered somewhere else in the list, despite having "special folders at top" option set. Need a better method than this. */ /* if ($mailbox == 'INBOX') { $mbx->is_special = true; } elseif (stristr($trash_folder , $mailbox)) { $mbx->is_special = true; } elseif (stristr($sent_folder , $mailbox)) { $mbx->is_special = true; } elseif (stristr($draft_folder , $mailbox)) { $mbx->is_special = true; } switch ($mailbox) { case 'INBOX': $mbx->is_inbox = true; $mbx->is_special = true; $mbx_ary[$i]['noselect'] = false; break; case $trash_folder: $mbx->is_trash = true; $mbx->is_special = true; break; case $sent_folder: $mbx->is_sent = true; $mbx->is_special = true; break; case $draft_folder: $mbx->is_draft = true; $mbx->is_special = true; break; } */ $mbx->is_special |= $mbx->is_inbox = strtoupper($mailbox) == 'INBOX'; $mbx->is_special |= $mbx->is_trash = isTrashMailbox($mailbox); $mbx->is_special |= $mbx->is_sent = isSentMailbox($mailbox); $mbx->is_special |= $mbx->is_draft = isDraftMailbox($mailbox); if (!$mbx->is_special) { $mbx->is_special = boolean_hook_function('special_mailbox', $mailbox, 1); } if (isset($mbx_ary[$i]['unseen'])) { $mbx->unseen = $mbx_ary[$i]['unseen']; } if (isset($mbx_ary[$i]['nummessages'])) { $mbx->total = $mbx_ary[$i]['nummessages']; } $mbx->is_noselect = $mbx_ary[$i]['noselect']; $mbx->is_noinferiors = $mbx_ary[$i]['noinferiors']; $r_del_pos = strrpos($mbx_ary[$i]['mbx'], $delimiter); if ($r_del_pos) { $mbx->mailboxname_sub = substr($mbx_ary[$i]['mbx'], $r_del_pos + 1); } else { /* mailbox is root folder */ $mbx->mailboxname_sub = $mbx_ary[$i]['mbx']; } $mbx->mailboxname_full = $mbx_ary[$i]['mbx']; $mailboxes->addMbx($mbx, $delimiter, $start, $list_special_folders_first); } } sqimap_utf7_decode_mbx_tree($mailboxes); sqimap_get_status_mbx_tree($imap_stream, $mailboxes); return $mailboxes; }
/** * Format message toolbar * * @param array $aMailbox Current mailbox information array * @param int $passed_id UID of current message * @param int $passed_ent_id Id of entity within message * @param object $message Current message object * @param void $removedVar This parameter is no longer used, but remains * so as not to break this function's prototype * (OPTIONAL) * @param boolean $nav_on_top When TRUE, the menubar is being constructed * for use at the top of the page, otherwise it * will be used for page bottom (OPTIONAL; * default = TRUE) */ function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removedVar = FALSE, $nav_on_top = TRUE) { global $base_uri, $draft_folder, $where, $what, $sort, $startMessage, $PHP_SELF, $save_as_draft, $enable_forward_as_attachment, $imapConnection, $lastTargetMailbox, $delete_prev_next_display, $show_copy_buttons, $compose_new_win, $compose_width, $compose_height, $oTemplate; //FIXME cleanup argument list, use $aMailbox where possible $mailbox = $aMailbox['NAME']; $urlMailbox = urlencode($mailbox); // Create Prev & Next links // Handle nested entities first (i.e. Mime Attach parts) $prev_href = $next_href = $up_href = $del_href = $del_prev_href = $del_next_href = ''; $msg_list_href = $search_href = $view_msg_href = ''; if (isset($passed_ent_id) && $passed_ent_id) { // code for navigating through attached message/rfc822 messages $url = set_url_var($PHP_SELF, 'passed_ent_id', 0); $entities = array(); $entity_count = array(); $c = 0; foreach ($message->parent->entities as $ent) { if ($ent->type0 == 'message' && $ent->type1 == 'rfc822') { $c++; $entity_count[$c] = $ent->entity_id; $entities[$ent->entity_id] = $c; } } if (isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] > 1) { $prev_ent_id = $entity_count[$entities[$passed_ent_id] - 1]; $prev_href = set_url_var($PHP_SELF, 'passed_ent_id', $prev_ent_id); } if (isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] < $c) { $next_ent_id = $entity_count[$entities[$passed_ent_id] + 1]; $next_href = set_url_var($PHP_SELF, 'passed_ent_id', $next_ent_id); } $par_ent_id = $message->parent->entity_id; if ($par_ent_id) { $par_ent_id = substr($par_ent_id, 0, -2); if ($par_ent_id != 0) { $up_href = set_url_var($PHP_SELF, 'passed_ent_id', $par_ent_id); } } $view_msg_href = $url; // Prev/Next links for regular messages } else { if (true) { //!(isset($where) && isset($what)) ) { $prev = findPreviousMessage($aMailbox['UIDSET'][$what], $passed_id); $next = findNextMessage($aMailbox['UIDSET'][$what], $passed_id); if ($prev >= 0) { $prev_href = $base_uri . 'src/read_body.php?passed_id=' . $prev . '&mailbox=' . $urlMailbox . '&sort=' . $sort . "&where={$where}&what={$what}" . '&startMessage=' . $startMessage . '&show_more=0'; } if ($next >= 0) { $next_href = $base_uri . 'src/read_body.php?passed_id=' . $next . '&mailbox=' . $urlMailbox . '&sort=' . $sort . "&where={$where}&what={$what}" . '&startMessage=' . $startMessage . '&show_more=0'; } // Only bother with Delete & Prev and Delete & Next IF // top display is enabled. if ($delete_prev_next_display == 1 && in_array('\\deleted', $aMailbox['PERMANENTFLAGS'], true)) { if ($prev >= 0) { $del_prev_href = $base_uri . 'src/read_body.php?passed_id=' . $prev . '&mailbox=' . $urlMailbox . '&sort=' . $sort . '&startMessage=' . $startMessage . '&show_more=0' . "&where={$where}&what={$what}" . '&delete_id=' . $passed_id . '&smtoken=' . sm_generate_security_token(); } if ($next >= 0) { $del_next_href = $base_uri . 'src/read_body.php?passed_id=' . $next . '&mailbox=' . $urlMailbox . '&sort=' . $sort . '&startMessage=' . $startMessage . '&show_more=0' . "&where={$where}&what={$what}" . '&delete_id=' . $passed_id . '&smtoken=' . sm_generate_security_token(); } } } } $msg_list_href = get_message_list_uri($aMailbox['NAME'], $startMessage, $what); if ($where == 'search.php') { $search_href = str_replace('read_body.php', 'search.php', $msg_list_href); } else { $search_href = ''; } $comp_uri = $base_uri . 'src/compose.php' . '?passed_id=' . $passed_id . '&mailbox=' . $urlMailbox . '&startMessage=' . $startMessage . (isset($passed_ent_id) ? '&passed_ent_id=' . $passed_ent_id : ''); // Start form for reply/reply all/forward.. $target = ''; $on_click = ''; $method = 'post'; $onsubmit = ''; if ($compose_new_win == '1') { if (!preg_match("/^[0-9]{3,4}\$/", $compose_width)) { $compose_width = '640'; } if (!preg_match("/^[0-9]{3,4}\$/", $compose_height)) { $compose_height = '550'; } if (checkForJavascript()) { $on_click = 'comp_in_new_form(\'' . $comp_uri . '\', this, this.form,' . $compose_width . ',' . $compose_height . ')'; $comp_uri = 'javascript:void(0)'; $method = 'get'; $onsubmit = 'return false'; } else { $target = '_blank'; } } $oTemplate->assign('nav_on_top', $nav_on_top); $oTemplate->assign('prev_href', $prev_href); $oTemplate->assign('up_href', $up_href); $oTemplate->assign('next_href', $next_href); $oTemplate->assign('del_prev_href', $del_prev_href); $oTemplate->assign('del_next_href', $del_next_href); $oTemplate->assign('view_msg_href', $view_msg_href); $oTemplate->assign('message_list_href', $msg_list_href); $oTemplate->assign('search_href', $search_href); $oTemplate->assign('form_extra', ''); $oTemplate->assign('form_method', $method); $oTemplate->assign('form_target', $target); $oTemplate->assign('form_onsubmit', $onsubmit); $oTemplate->assign('compose_href', $comp_uri); $oTemplate->assign('button_onclick', $on_click); $oTemplate->assign('forward_as_attachment_enabled', $enable_forward_as_attachment == 1); //FIXME: I am surprised these aren't already given to the template; probably needs to be given at a higher level, so I have NO IDEA if this is the right place to do this... adding them so template can construct its own API calls... we can build those herein too if preferrable $oTemplate->assign('mailbox', $aMailbox['NAME']); $oTemplate->assign('passed_id', $passed_id); $oTemplate->assign('what', $what); // If Draft folder - create Resume link $resume_draft = $edit_as_new = false; if (isDraftMailbox($mailbox) && $save_as_draft) { $resume_draft = true; } else { if (handleAsSent($mailbox)) { $edit_as_new = true; } } $oTemplate->assign('can_resume_draft', $resume_draft); $oTemplate->assign('can_edit_as_new', $edit_as_new); $oTemplate->assign('mailboxes', sqimap_mailbox_option_array($imapConnection)); if (in_array('\\deleted', $aMailbox['PERMANENTFLAGS'], true)) { $delete_url = $base_uri . "src/{$where}"; $oTemplate->assign('can_be_deleted', true); $oTemplate->assign('move_delete_form_action', $base_uri . 'src/' . $where); $oTemplate->assign('delete_form_extra', addHidden('mailbox', $aMailbox['NAME']) . "\n" . addHidden('msg[0]', $passed_id) . "\n" . addHidden('startMessage', $startMessage) . "\n"); if (!(isset($passed_ent_id) && $passed_ent_id)) { $oTemplate->assign('can_be_moved', true); $oTemplate->assign('move_form_extra', addHidden('mailbox', $aMailbox['NAME']) . "\n" . addHidden('msg[0]', $passed_id) . "\n"); $oTemplate->assign('last_move_target', isset($lastTargetMailbox) && !empty($lastTargetMailbox) ? $lastTargetMailbox : ''); $oTemplate->assign('can_be_copied', $show_copy_buttons == 1); } else { $oTemplate->assign('can_be_moved', false); $oTemplate->assign('move_form_extra', ''); $oTemplate->assign('last_move_target', ''); $oTemplate->assign('can_be_copied', false); } } else { $oTemplate->assign('can_be_deleted', false); $oTemplate->assign('move_delete_form_action', ''); $oTemplate->assign('delete_form_extra', ''); $oTemplate->assign('can_be_moved', false); $oTemplate->assign('move_form_extra', ''); $oTemplate->assign('last_move_target', ''); $oTemplate->assign('can_be_copied', false); } // access keys... only add to the top menubar, because adding // them twice makes them less functional (press access key, *then* // press <enter> to make it work) // if ($nav_on_top) { global $accesskey_read_msg_reply, $accesskey_read_msg_reply_all, $accesskey_read_msg_forward, $accesskey_read_msg_as_attach, $accesskey_read_msg_delete, $accesskey_read_msg_bypass_trash, $accesskey_read_msg_move, $accesskey_read_msg_move_to, $accesskey_read_msg_copy; } else { $accesskey_read_msg_reply = $accesskey_read_msg_reply_all = $accesskey_read_msg_forward = $accesskey_read_msg_as_attach = $accesskey_read_msg_delete = $accesskey_read_msg_bypass_trash = $accesskey_read_msg_move = $accesskey_read_msg_move_to = $accesskey_read_msg_copy = 'NONE'; } $oTemplate->assign('accesskey_read_msg_reply', $accesskey_read_msg_reply); $oTemplate->assign('accesskey_read_msg_reply_all', $accesskey_read_msg_reply_all); $oTemplate->assign('accesskey_read_msg_forward', $accesskey_read_msg_forward); $oTemplate->assign('accesskey_read_msg_as_attach', $accesskey_read_msg_as_attach); $oTemplate->assign('accesskey_read_msg_delete', $accesskey_read_msg_delete); $oTemplate->assign('accesskey_read_msg_bypass_trash', $accesskey_read_msg_bypass_trash); $oTemplate->assign('accesskey_read_msg_move_to', $accesskey_read_msg_move_to); $oTemplate->assign('accesskey_read_msg_move', $accesskey_read_msg_move); $oTemplate->assign('accesskey_read_msg_copy', $accesskey_read_msg_copy); global $null; do_hook('read_body_menu', $null); if ($nav_on_top) { $oTemplate->display('read_menubar_nav.tpl'); $oTemplate->display('read_menubar_buttons.tpl'); } else { $oTemplate->display('read_menubar_buttons.tpl'); $oTemplate->display('read_menubar_nav.tpl'); } }