diff options
Diffstat (limited to 'program/steps/mail')
-rw-r--r-- | program/steps/mail/compose.inc | 44 | ||||
-rw-r--r-- | program/steps/mail/func.inc | 165 | ||||
-rw-r--r-- | program/steps/mail/upload.inc | 14 |
3 files changed, 195 insertions, 28 deletions
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index 1848acf23..03f508be8 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -120,7 +120,7 @@ function rcmail_compose_headers($attrib) $header = 'to'; // we have contact id's as get parameters - if (strlen($_GET['_to']) && preg_match('/[0-9]+,?/', $_GET['_to'])) + if (!empty($_GET['_to']) && preg_match('/[0-9]+,?/', $_GET['_to'])) { $a_recipients = array(); $sql_result = $DB->query(sprintf("SELECT name, email @@ -138,7 +138,7 @@ function rcmail_compose_headers($attrib) if (sizeof($a_recipients)) $fvalue = join(', ', $a_recipients); } - else if (strlen($_GET['_to'])) + else if (!empty($_GET['_to'])) $fvalue = $_GET['_to']; case 'cc': @@ -165,7 +165,7 @@ function rcmail_compose_headers($attrib) } - if ($fname && $_POST[$fname]) + if ($fname && !empty($_POST[$fname])) $fvalue = $_POST[$fname]; else if ($header && is_object($REPLY_MESSAGE['headers'])) { @@ -282,7 +282,7 @@ function rcmail_compose_body($attrib) $body = ''; // use posted message body - if ($_POST['_message']) + if (!empty($_POST['_message'])) $body = stripslashes($_POST['_message']); // compose reply-body @@ -352,6 +352,34 @@ function rcmail_create_forward_body($body) $IMAP->decode_header($FORWARD_MESSAGE['headers']->from), $IMAP->decode_header($FORWARD_MESSAGE['headers']->to)); + // add attachments + if (!isset($_SESSION['compose']['forward_attachments']) && is_array($FORWARD_MESSAGE['parts']) && sizeof($FORWARD_MESSAGE['parts'])>1) + { + $temp_dir = rcmail_create_compose_tempdir(); + + if (!is_array($_SESSION['compose']['attachments'])) + $_SESSION['compose']['attachments'] = array(); + + foreach ($FORWARD_MESSAGE['parts'] as $part) + { + if ($part->disposition != 'attachment') + continue; + + $tmp_path = tempnam($temp_dir, 'rcmAttmnt'); + if ($fp = fopen($tmp_path, 'w')) + { + fwrite($fp, $IMAP->mime_decode($part->body, $part->headers['content-transfer-encoding'])); + fclose($fp); + + $_SESSION['compose']['attachments'][] = array('name' => $part->d_parameters['filename'], + 'mimetype' => $part->ctype_primary . '/' . $part->ctype_secondary, + 'path' => $tmp_path); + } + } + + $_SESSION['compose']['forward_attachments'] = TRUE; + } + return $prefix.$body; } @@ -370,7 +398,7 @@ function rcmail_compose_subject($attrib) $subject = ''; // use subject from post - if ($_POST['_subject']) + if (isset($_POST['_subject'])) $subject = stripslashes($_POST['_subject']); // create a reply-subject @@ -473,7 +501,7 @@ function rcmail_priority_selector($attrib) rcube_label('highest')), array(1, 2, 0, 4, 5)); - $sel = $_POST['_priority'] ? $_POST['_priority'] : 0; + $sel = isset($_POST['_priority']) ? $_POST['_priority'] : 0; $out = $form_start ? "$form_start\n" : ''; $out .= $selector->show($sel); @@ -493,13 +521,13 @@ function get_form_tags($attrib) $hiddenfields = new hiddenfield(array('name' => '_task', 'value' => $GLOBALS['_task'])); $hiddenfields->add(array('name' => '_action', 'value' => 'send')); - $form_start = !strlen($attrib['form']) ? '<form name="form" action="./" method="post">' : ''; + $form_start = empty($attrib['form']) ? '<form name="form" action="./" method="post">' : ''; $form_start .= "\n$SESS_HIDDEN_FIELD\n"; $form_start .= $hiddenfields->show(); } $form_end = (strlen($MESSAGE_FORM) && !strlen($attrib['form'])) ? '</form>' : ''; - $form_name = strlen($attrib['form']) ? $attrib['form'] : 'form'; + $form_name = !empty($attrib['form']) ? $attrib['form'] : 'form'; if (!strlen($MESSAGE_FORM)) $OUTPUT->add_script("$JS_OBJECT_NAME.gui_object('messageform', '$form_name');"); diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 78b61377b..6ffde1c90 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -58,6 +58,7 @@ function rcmail_mailbox_list($attrib) { global $IMAP, $CONFIG, $OUTPUT, $JS_OBJECT_NAME, $COMM_PATH; static $s_added_script = FALSE; + static $a_mailboxes; $type = $attrib['type'] ? $attrib['type'] : 'ul'; $add_attrib = $type=='select' ? array('style', 'class', 'id', 'name', 'onchange') : @@ -77,37 +78,63 @@ function rcmail_mailbox_list($attrib) rcube_label($attrib['noselection'])); // get mailbox list - $a_folders = $IMAP->list_mailboxes(); $mbox = $IMAP->get_mailbox_name(); // for these mailboxes we have localized labels $special_mailboxes = array('inbox', 'sent', 'drafts', 'trash', 'junk'); + + // build the folders tree + if (empty($a_mailboxes)) + { + // get mailbox list + $a_folders = $IMAP->list_mailboxes(); + $delimiter = $IMAP->get_hierarchy_delimiter(); + $a_mailboxes = array(); + + foreach ($a_folders as $folder) + rcmail_build_folder_tree($a_mailboxes, $folder, $delimiter); + } + +// var_dump($a_mailboxes); + + if ($type=='select') + $out .= rcmail_render_folder_tree_select($a_mailboxes, $special_mailboxes, $mbox); + else + $out .= rcmail_render_folder_tree_html($a_mailboxes, $special_mailboxes, $mbox); + + +/* foreach ($a_folders as $i => $folder) { $zebra_class = $i%2 ? 'even' : 'odd'; - - $folder_lc = strtolower($folder); + $folder_prop = $a_subfolders[$folder]; + $foldername = isset($folder_prop) ? $folder_prop['name'] : $folder; + + $folder_lc = strtolower($foldername); if (in_array($folder_lc, $special_mailboxes)) $foldername = rcube_label($folder_lc); - else - $foldername = $folder; if ($unread_count = $IMAP->messagecount($folder, 'UNSEEN')) $foldername .= sprintf(' (%d)', $unread_count); - + + $indent = isset($folder_prop) ? sprintf(' indent%d', $folder_prop['level']) : ''; + $indent_str = isset($folder_prop) ? str_repeat(' ', (int)$folder_prop['level']) : ''; + // compose mailbox line if ($type=='select') - $out .= sprintf('<option value="%s">%s</option>'."\n", + $out .= sprintf('<option value="%s">%s%s</option>'."\n", $folder, + $indent_str, rep_specialchars_output($foldername)); else - $out .= sprintf('<li class="mailbox %s %s%s%s"><a href="#%s" onclick="return %s.command(\'list\',\'%s\')" onmouseup="return %s.mbox_mouse_up(\'%s\')">%s</a></li>'."\n", - preg_replace('/[^a-z0-9\-_]/', '', $folder_lc), + $out .= sprintf('<li class="mailbox %s %s%s%s%s"><a href="#%s" onclick="return %s.command(\'list\',\'%s\')" onmouseup="return %s.mbox_mouse_up(\'%s\')">%s</a></li>'."\n", + preg_replace('/[^a-z0-9\-_]/', '', strtolower($folder)), $zebra_class, $unread_count ? ' unread' : '', $folder==$mbox ? ' selected' : '', + $indent, $folder, $JS_OBJECT_NAME, $folder, @@ -115,6 +142,7 @@ function rcmail_mailbox_list($attrib) $folder, rep_specialchars_output($foldername)); } +*/ if ($type=='ul') $OUTPUT->add_script(sprintf("%s.gui_object('mailboxlist', '%s');", $JS_OBJECT_NAME, $attrib['id'])); @@ -132,6 +160,104 @@ function rcmail_mailbox_list($attrib) } + + +// create a hierarchical array of the mailbox list +function rcmail_build_folder_tree(&$arrFolders, $folder, $delm='/', $path='') + { + $pos = strpos($folder, $delm); + if ($pos !== false) + { + $subFolders = substr($folder, $pos+1); + $currentFolder = substr($folder, 0, $pos); + } + else + { + $subFolders = false; + $currentFolder = $folder; + } + + $path .= $currentFolder; + + if (!isset($arrFolders[$currentFolder])) + { + $arrFolders[$currentFolder] = array('id' => $path, + 'name' => $currentFolder, + 'folders' => array()); + } + + if (!empty($subFolders)) + rcmail_build_folder_tree($arrFolders[$currentFolder]['folders'], $subFolders, $delm, $path.$delm); + } + + +// return html for a structured list <ul> for the mailbox tree +function rcmail_render_folder_tree_html(&$arrFolders, &$special, &$mbox, $nestLevel = 0) + { + global $JS_OBJECT_NAME, $IMAP; + + $idx = 0; + $out = ''; + foreach ($arrFolders as $key => $folder) + { + $zebra_class = ($nestLevel*$idx)%2 ? 'even' : 'odd'; + + $folder_lc = strtolower($folder['id']); + if (in_array($folder_lc, $special)) + $foldername = rcube_label($folder_lc); + else + $foldername = $folder['name']; + + if ($unread_count = $IMAP->messagecount($folder['id'], 'UNSEEN')) + $foldername .= sprintf(' (%d)', $unread_count); + + $out .= sprintf('<li class="mailbox %s %s%s%s"><a href="#%s" onclick="return %s.command(\'list\',\'%s\')" onmouseup="return %s.mbox_mouse_up(\'%s\')">%s</a>'."\n", + preg_replace('/[^a-z0-9\-_]/', '', $folder_lc), + $zebra_class, + $unread_count ? ' unread' : '', + $folder['id']==$mbox ? ' selected' : '', + $folder['id'], + $JS_OBJECT_NAME, + $folder['id'], + $JS_OBJECT_NAME, + $folder['id'], + rep_specialchars_output($foldername)); + + if (!empty($folder['folders'])) + $out .= '<ul>' . rcmail_render_folder_tree_html($folder['folders'], $special, $mbox, $nestLevel+1) . "</ul>\n"; + + $out .= "</li>\n"; + $idx++; + } + + return $out; + } + + +// return html for a flat list <select> for the mailbox tree +function rcmail_render_folder_tree_select(&$arrFolders, &$special, &$mbox, $nestLevel=0) + { + global $IMAP; + + $idx = 0; + $out = ''; + foreach ($arrFolders as $key=>$folder) + { + $out .= sprintf('<option value="%s">%s%s</option>'."\n", + $folder['id'], + str_repeat(' ', $nestLevel*4), + rep_specialchars_output($folder['name'])); + + if (!empty($folder['folders'])) + $out .= rcmail_render_folder_tree_select($folder['folders'], $special, $mbox, $nestLevel+1); + + $idx++; + } + + return $out; + } + + // return the message list as HTML table function rcmail_message_list($attrib) { @@ -1078,6 +1204,27 @@ function rcmail_message_part_frame($attrib) } +// create temp dir for attachments +function rcmail_create_compose_tempdir() + { + global $CONFIG; + + if ($_SESSION['compose']['temp_dir']) + return $_SESSION['compose']['temp_dir']; + + if (!empty($CONFIG['temp_dir'])) + $temp_dir = $CONFIG['temp_dir'].(!eregi('\/$', $CONFIG['temp_dir']) ? '/' : '').$_SESSION['compose']['id']; + + // create temp-dir for uploaded attachments + if (!empty($CONFIG['temp_dir']) && is_writeable($CONFIG['temp_dir'])) + { + mkdir($temp_dir); + $_SESSION['compose']['temp_dir'] = $temp_dir; + } + + return $_SESSION['compose']['temp_dir']; + } + // clear message composing settings function rcmail_compose_cleanup() diff --git a/program/steps/mail/upload.inc b/program/steps/mail/upload.inc index 3ae88fad6..308ec796e 100644 --- a/program/steps/mail/upload.inc +++ b/program/steps/mail/upload.inc @@ -26,21 +26,13 @@ if (!$_SESSION['compose']) } -if (strlen($CONFIG['temp_dir'])) - $temp_dir = $CONFIG['temp_dir'].(!eregi('\/$', $CONFIG['temp_dir']) ? '/' : '').$_SESSION['compose']['id']; +// create temp dir for file uploads +$temp_dir = rcmail_create_compose_tempdir(); + if (!is_array($_SESSION['compose']['attachments'])) - { $_SESSION['compose']['attachments'] = array(); - // create temp-dir for uploaded attachments - if ($CONFIG['temp_dir'] && is_writeable($CONFIG['temp_dir'])) - { - mkdir($temp_dir); - $_SESSION['compose']['temp_dir'] = $temp_dir; - } - } - $response = ''; |