| | |
| | | } |
| | | |
| | | // set imap properties and session vars |
| | | if ($mbox = get_input_value('_mbox', RCUBE_INPUT_GPC)) |
| | | if (strlen(trim($mbox = get_input_value('_mbox', RCUBE_INPUT_GPC, true)))) |
| | | $IMAP->set_mailbox(($_SESSION['mbox'] = $mbox)); |
| | | else if ($IMAP) |
| | | $_SESSION['mbox'] = $IMAP->get_mailbox_name(); |
| | |
| | | $IMAP->set_threading($a_threading[$_SESSION['mbox']]); |
| | | |
| | | // set message set for search result |
| | | if (!empty($_REQUEST['_search']) && isset($_SESSION['search'][$_REQUEST['_search']])) |
| | | { |
| | | $IMAP->set_search_set($_SESSION['search'][$_REQUEST['_search']]); |
| | | if (!empty($_REQUEST['_search']) && isset($_SESSION['search']) |
| | | && $_SESSION['search_request'] == $_REQUEST['_search'] |
| | | ) { |
| | | $IMAP->set_search_set($_SESSION['search']); |
| | | $OUTPUT->set_env('search_request', $_REQUEST['_search']); |
| | | $OUTPUT->set_env('search_text', $_SESSION['last_text_search']); |
| | | } |
| | | } |
| | | |
| | | // set main env variables, labels and page title |
| | | if (empty($RCMAIL->action) || $RCMAIL->action == 'list') |
| | | { |
| | | if (empty($RCMAIL->action) || $RCMAIL->action == 'list') { |
| | | $mbox_name = $IMAP->get_mailbox_name(); |
| | | |
| | | if (empty($RCMAIL->action)) |
| | | { |
| | | if (empty($RCMAIL->action)) { |
| | | // initialize searching result if search_filter is used |
| | | if ($_SESSION['search_filter'] && $_SESSION['search_filter'] != 'ALL') |
| | | { |
| | | if ($_SESSION['search_filter'] && $_SESSION['search_filter'] != 'ALL') { |
| | | $search_request = md5($mbox_name.$_SESSION['search_filter']); |
| | | |
| | | $IMAP->search($mbox_name, $_SESSION['search_filter'], RCMAIL_CHARSET, $_SESSION['sort_col']); |
| | | $_SESSION['search'][$search_request] = $IMAP->get_search_set(); |
| | | $_SESSION['search'] = $IMAP->get_search_set(); |
| | | $_SESSION['search_request'] = $search_request; |
| | | $OUTPUT->set_env('search_request', $search_request); |
| | | } |
| | | |
| | | $search_mods = $RCMAIL->config->get('search_mods', $SEARCH_MODS_DEFAULT); |
| | | $OUTPUT->set_env('search_mods', $search_mods); |
| | | } |
| | | } |
| | | |
| | | // set current mailbox and some other vars in client environment |
| | | $OUTPUT->set_env('mailbox', $mbox_name); |
| | |
| | | |
| | | if (!$OUTPUT->ajax_call) |
| | | $OUTPUT->add_label('checkingmail', 'deletemessage', 'movemessagetotrash', |
| | | 'movingmessage', 'copyingmessage', 'copy', 'move', 'quota'); |
| | | 'movingmessage', 'copyingmessage', 'deletingmessage', 'markingmessage', |
| | | 'copy', 'move', 'quota'); |
| | | |
| | | $OUTPUT->set_pagetitle(rcmail_localize_foldername($mbox_name)); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | |
| | | $OUTPUT->set_env('autoexpand_threads', intval($CONFIG['autoexpand_threads'])); |
| | | $OUTPUT->set_env('sort_col', $_SESSION['sort_col']); |
| | | $OUTPUT->set_env('sort_order', $_SESSION['sort_order']); |
| | | |
| | | if ($attrib['messageicon']) |
| | | $OUTPUT->set_env('messageicon', $skin_path . $attrib['messageicon']); |
| | | if ($attrib['deletedicon']) |
| | | $OUTPUT->set_env('deletedicon', $skin_path . $attrib['deletedicon']); |
| | | if ($attrib['unreadicon']) |
| | | $OUTPUT->set_env('unreadicon', $skin_path . $attrib['unreadicon']); |
| | | if ($attrib['repliedicon']) |
| | | $OUTPUT->set_env('repliedicon', $skin_path . $attrib['repliedicon']); |
| | | if ($attrib['forwardedicon']) |
| | | $OUTPUT->set_env('forwardedicon', $skin_path . $attrib['forwardedicon']); |
| | | if ($attrib['forwardedrepliedicon']) |
| | | $OUTPUT->set_env('forwardedrepliedicon', $skin_path . $attrib['forwardedrepliedicon']); |
| | | if ($attrib['attachmenticon']) |
| | | $OUTPUT->set_env('attachmenticon', $skin_path . $attrib['attachmenticon']); |
| | | if ($attrib['flaggedicon']) |
| | | $OUTPUT->set_env('flaggedicon', $skin_path . $attrib['flaggedicon']); |
| | | if ($attrib['unflaggedicon']) |
| | | $OUTPUT->set_env('unflaggedicon', $skin_path . $attrib['unflaggedicon']); |
| | | if ($attrib['unreadchildrenicon']) |
| | | $OUTPUT->set_env('unreadchildrenicon', $skin_path . $attrib['unreadchildrenicon']); |
| | | |
| | | $OUTPUT->set_env('messages', array()); |
| | | $OUTPUT->set_env('coltypes', $a_show_cols); |
| | | |
| | |
| | | if (empty($a_headers)) |
| | | return; |
| | | |
| | | // remove 'threads', 'attachment', 'flag' columns, we don't need them here |
| | | if (($key = array_search('attachment', $a_show_cols)) !== FALSE) |
| | | unset($a_show_cols[$key]); |
| | | if (($key = array_search('flag', $a_show_cols)) !== FALSE) |
| | | unset($a_show_cols[$key]); |
| | | if (($key = array_search('threads', $a_show_cols)) !== FALSE) |
| | | unset($a_show_cols[$key]); |
| | | // loop through message headers |
| | | // remove 'threads', 'attachment', 'flag', 'status' columns, we don't need them here |
| | | foreach (array('threads', 'attachment', 'flag', 'status') as $col) { |
| | | if (($key = array_search($col, $a_show_cols)) !== FALSE) |
| | | unset($a_show_cols[$key]); |
| | | } |
| | | |
| | | foreach ($a_headers as $n => $header) |
| | | { |
| | | // loop through message headers |
| | | foreach ($a_headers as $n => $header) { |
| | | if (empty($header)) |
| | | continue; |
| | | |
| | |
| | | $IMAP->set_charset(!empty($header->charset) ? $header->charset : $CONFIG['default_charset']); |
| | | |
| | | // format each col; similar as in rcmail_message_list() |
| | | foreach ($a_show_cols as $col) |
| | | { |
| | | foreach ($a_show_cols as $col) { |
| | | if (in_array($col, array('from', 'to', 'cc', 'replyto'))) |
| | | $cont = Q(rcmail_address_string($header->$col, 3), 'show'); |
| | | else if ($col=='subject') |
| | | { |
| | | else if ($col=='subject') { |
| | | $cont = abbreviate_string(trim($IMAP->decode_header($header->$col)), 160); |
| | | if (!$cont) $cont = rcube_label('nosubject'); |
| | | $cont = Q($cont); |
| | | } |
| | | } |
| | | else if ($col=='size') |
| | | $cont = show_bytes($header->$col); |
| | | else if ($col=='date') |
| | |
| | | $cont = Q($header->$col); |
| | | |
| | | $a_msg_cols[$col] = $cont; |
| | | } |
| | | } |
| | | |
| | | if ($header->depth) |
| | | $a_msg_flags['depth'] = $header->depth; |
| | |
| | | $a_msg_flags['forwarded'] = 1; |
| | | if ($header->flagged) |
| | | $a_msg_flags['flagged'] = 1; |
| | | if (preg_match("/(application\/|multipart\/m)/i", $header->ctype)) |
| | | $a_msg_flags['attachment'] = 1; |
| | | if ($header->others['list-post']) |
| | | $a_msg_flags['ml'] = 1; |
| | | |
| | | $a_msg_flags['ctype'] = Q($header->ctype); |
| | | $a_msg_flags['mbox'] = $mbox; |
| | | |
| | | // merge with plugin result |
| | |
| | | $a_msg_cols, |
| | | $a_msg_flags, |
| | | $insert_top); |
| | | } |
| | | } |
| | | |
| | | if ($IMAP->threading) { |
| | | $OUTPUT->command('init_threads', (array) $roots); |
| | | } |
| | | if ($IMAP->threading) { |
| | | $OUTPUT->command('init_threads', (array) $roots); |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | // define sortable columns |
| | | $a_sort_cols = array('subject', 'date', 'from', 'to', 'size', 'cc'); |
| | | |
| | | if (!empty($attrib['optionsmenuicon'])) |
| | | $list_menu = html::a( |
| | | array('href' => '#', 'onclick' => 'return '.JS_OBJECT_NAME.".command('menu-open', 'messagelistmenu')"), |
| | | html::img(array('src' => $skin_path . $attrib['optionsmenuicon'], 'id' => 'listmenulink', 'title' => rcube_label('listoptions'))) |
| | | ); |
| | | if (!empty($attrib['optionsmenuicon'])) { |
| | | $onclick = 'return ' . JS_OBJECT_NAME . ".command('menu-open', 'messagelistmenu')"; |
| | | if ($attrib['optionsmenuicon'] === true || $attrib['optionsmenuicon'] == 'true') |
| | | $list_menu = html::div(array('onclick' => $onclick, 'class' => 'listmenu', |
| | | 'id' => 'listmenulink', 'title' => rcube_label('listoptions'))); |
| | | else |
| | | $list_menu = html::a(array('href' => '#', 'onclick' => $onclick), |
| | | html::img(array('src' => $skin_path . $attrib['optionsmenuicon'], |
| | | 'id' => 'listmenulink', 'title' => rcube_label('listoptions'))) |
| | | ); |
| | | } |
| | | else |
| | | $list_menu = ''; |
| | | |
| | |
| | | // get column name |
| | | switch ($col) { |
| | | case 'flag': |
| | | $col_name = sprintf($image_tag, $skin_path, $attrib['unflaggedicon'], ''); |
| | | $col_name = '<span class="flagged"> </span>'; |
| | | break; |
| | | case 'attachment': |
| | | $col_name = sprintf($image_tag, $skin_path, $attrib['attachmenticon'], ''); |
| | | case 'status': |
| | | $col_name = '<span class="' . $col .'"> </span>'; |
| | | break; |
| | | case 'threads': |
| | | $col_name = $list_menu; |
| | |
| | | $col_name = html::a(array('href'=>"./#sort", 'onclick' => 'return '.JS_OBJECT_NAME.".command('sort','".$col."',this)", 'title' => rcube_label('sortby')), $col_name); |
| | | |
| | | $sort_class = $col == $sort_col ? " sorted$sort_order" : ''; |
| | | $class_name = $col == 'attachment' ? 'icon' : $col.$sort_class; |
| | | $class_name = $col.$sort_class; |
| | | |
| | | // put it all together |
| | | $cells[] = array('className' => $class_name, 'id' => "rcm$col", 'html' => $col_name); |
| | |
| | | |
| | | function rcmail_messagecount_display($attrib) |
| | | { |
| | | global $IMAP, $OUTPUT; |
| | | global $RCMAIL; |
| | | |
| | | if (!$attrib['id']) |
| | | $attrib['id'] = 'rcmcountdisplay'; |
| | | |
| | | $OUTPUT->add_gui_object('countdisplay', $attrib['id']); |
| | | $RCMAIL->output->add_gui_object('countdisplay', $attrib['id']); |
| | | |
| | | return html::span($attrib, rcmail_get_messagecount_text()); |
| | | $content = $RCMAIL->action != 'show' ? rcmail_get_messagecount_text() : rcube_label('loading'); |
| | | |
| | | return html::span($attrib, $content); |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | function rcmail_get_messagecount_text($count=NULL, $page=NULL) |
| | | { |
| | | global $RCMAIL, $IMAP, $MESSAGE; |
| | | |
| | | if (isset($MESSAGE->index)) |
| | | { |
| | | return rcube_label(array('name' => 'messagenrof', |
| | | 'vars' => array('nr' => $MESSAGE->index+1, |
| | | 'count' => $count!==NULL ? $count : $IMAP->messagecount(NULL, 'ALL')))); // Only messages, no threads here |
| | | } |
| | | global $RCMAIL, $IMAP; |
| | | |
| | | if ($page===NULL) |
| | | $page = $IMAP->list_page; |
| | |
| | | { |
| | | global $RCMAIL; |
| | | |
| | | $old_unseen = $_SESSION['unseen_count'][$mbox_name]; |
| | | $old_unseen = rcmail_get_unseen_count($mbox_name); |
| | | |
| | | if ($count === null) |
| | | $unseen = $RCMAIL->imap->messagecount($mbox_name, 'UNSEEN', $force); |
| | |
| | | if ($unseen != $old_unseen || ($mbox_name == 'INBOX')) |
| | | $RCMAIL->output->command('set_unread_count', $mbox_name, $unseen, ($mbox_name == 'INBOX')); |
| | | |
| | | // @TODO: this data is doubled (session and cache tables) if caching is enabled |
| | | $_SESSION['unseen_count'][$mbox_name] = $unseen; |
| | | rcmail_set_unseen_count($mbox_name, $unseen); |
| | | |
| | | return $unseen; |
| | | } |
| | | |
| | | |
| | | function rcmail_set_unseen_count($mbox_name, $count) |
| | | { |
| | | // @TODO: this data is doubled (session and cache tables) if caching is enabled |
| | | |
| | | // Make sure we have an array here (#1487066) |
| | | if (!is_array($_SESSION['unseen_count'])) |
| | | $_SESSION['unseen_count'] = array(); |
| | | |
| | | $_SESSION['unseen_count'][$mbox_name] = $count; |
| | | } |
| | | |
| | | |
| | | function rcmail_get_unseen_count($mbox_name) |
| | | { |
| | | if (is_array($_SESSION['unseen_count']) && array_key_exists($mbox_name, $_SESSION['unseen_count'])) |
| | | return $_SESSION['unseen_count'][$mbox_name]; |
| | | else |
| | | return null; |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | // charset was converted to UTF-8 in rcube_imap::get_message_part(), |
| | | // -> change charset specification in HTML accordingly |
| | | $charset_pattern = '(<meta\s+[^>]* content=)[\'"]?(\w+\/\w+;\s*charset=)([a-z0-9-_]+[\'"]?)'; |
| | | $charset_pattern = '(<meta\s+[^>]*content=)[\'"]?(\w+\/\w+;\s*charset=)([a-z0-9-_]+[\'"]?)'; |
| | | if (preg_match("/$charset_pattern/Ui", $html)) { |
| | | $html = preg_replace("/$charset_pattern/i", '\\1"\\2'.RCMAIL_CHARSET.'"', $html); |
| | | } |
| | |
| | | $html = '<head></head>'. $html; |
| | | $html = substr_replace($html, '<meta http-equiv="Content-Type" content="text/html; charset='.RCMAIL_CHARSET.'" />', intval(stripos($html, '<head>')+6), 0); |
| | | } |
| | | |
| | | // turn relative into absolute urls |
| | | $html = rcmail_resolve_base($html); |
| | | |
| | |
| | | $quote_level = $q; |
| | | } |
| | | |
| | | // quote plain text |
| | | $body = Q(join("\n", $a_lines), 'dummy', false); |
| | | $body = join("\n", $a_lines); |
| | | |
| | | // colorize signature |
| | | // quote plain text (don't use Q() here, to display entities "as is") |
| | | $table = get_html_translation_table(HTML_SPECIALCHARS); |
| | | unset($table['?']); |
| | | $body = strtr($body, $table); |
| | | |
| | | // colorize signature (up to <sig_max_lines> lines) |
| | | $len = strlen($body); |
| | | $sig_max_lines = $RCMAIL->config->get('sig_max_lines', 15); |
| | | while (($sp = strrpos($body, "-- \n", $sp ? -$len+$sp-1 : 0)) !== false) { |
| | | if ($sp == 0 || $body[$sp-1] == "\n") { |
| | | // do not touch blocks with more that X lines |
| | | if (substr_count($body, "\n", $sp) < $RCMAIL->config->get('sig_max_lines', 15)) |
| | | if (substr_count($body, "\n", $sp) < $sig_max_lines) |
| | | $body = substr($body, 0, max(0, $sp)) |
| | | .'<span class="sig">'.substr($body, $sp).'</span>'; |
| | | break; |
| | |
| | | $headers = is_object($MESSAGE->headers) ? get_object_vars($MESSAGE->headers) : $MESSAGE->headers; |
| | | |
| | | // show these headers |
| | | $standard_headers = array('subject', 'from', 'to', 'cc', 'bcc', 'replyto', 'date'); |
| | | $standard_headers = array('subject', 'from', 'to', 'cc', 'bcc', 'replyto', |
| | | 'mail-reply-to', 'mail-followup-to', 'date'); |
| | | $output_headers = array(); |
| | | |
| | | foreach ($standard_headers as $hkey) { |
| | | if (!$headers[$hkey]) |
| | | if ($headers[$hkey]) |
| | | $value = $headers[$hkey]; |
| | | else if ($headers['others'][$hkey]) |
| | | $value = $headers['others'][$hkey]; |
| | | else |
| | | continue; |
| | | |
| | | if ($hkey == 'date') { |
| | | if ($PRINT_MODE) |
| | | $header_value = format_date($headers[$hkey], $RCMAIL->config->get('date_long', 'x')); |
| | | $header_value = format_date($value, $RCMAIL->config->get('date_long', 'x')); |
| | | else |
| | | $header_value = format_date($headers[$hkey]); |
| | | $header_value = format_date($value); |
| | | } |
| | | else if ($hkey == 'replyto') { |
| | | if ($headers['replyto'] != $headers['from']) |
| | | $header_value = rcmail_address_string($headers['replyto'], null, true, $attrib['addicon']); |
| | | $header_value = rcmail_address_string($value, null, true, $attrib['addicon']); |
| | | else |
| | | continue; |
| | | } |
| | | else if ($hkey == 'mail-reply-to') { |
| | | if ($headers['mail-replyto'] != $headers['reply-to'] |
| | | && $headers['reply-to'] != $headers['from'] |
| | | ) |
| | | $header_value = rcmail_address_string($value, null, true, $attrib['addicon']); |
| | | else |
| | | continue; |
| | | } |
| | | else if ($hkey == 'mail-followup-to') { |
| | | $header_value = rcmail_address_string($value, null, true, $attrib['addicon']); |
| | | } |
| | | else if (in_array($hkey, array('from', 'to', 'cc', 'bcc'))) |
| | | $header_value = rcmail_address_string($headers[$hkey], null, true, $attrib['addicon']); |
| | | else if ($hkey == 'subject' && empty($headers[$hkey])) |
| | | $header_value = rcmail_address_string($value, null, true, $attrib['addicon']); |
| | | else if ($hkey == 'subject' && empty($value)) |
| | | $header_value = rcube_label('nosubject'); |
| | | else |
| | | $header_value = trim($IMAP->decode_header($headers[$hkey])); |
| | | $header_value = trim($IMAP->decode_header($value)); |
| | | |
| | | $output_headers[$hkey] = array('title' => rcube_label($hkey), 'value' => $header_value, 'raw' => $headers[$hkey]); |
| | | $output_headers[$hkey] = array('title' => rcube_label($hkey), 'value' => $header_value, 'raw' => $value); |
| | | } |
| | | |
| | | $plugin = $RCMAIL->plugins->exec_hook('message_headers_output', array('output' => $output_headers, 'headers' => $MESSAGE->headers)); |
| | |
| | | |
| | | foreach ($plugin['output'] as $hkey => $row) { |
| | | $table->add(array('class' => 'header-title'), Q($row['title'])); |
| | | $table->add(array('class' => $hkey, 'width' => "90%"), Q($row['value'], ($hkey == 'subject' ? 'strict' : 'show'))); |
| | | $table->add(array('class' => 'header '.$hkey), Q($row['value'], ($hkey == 'subject' ? 'strict' : 'show'))); |
| | | } |
| | | |
| | | // all headers division |
| | |
| | | * @param array $mailto Array of recipient address strings |
| | | * @param array $smtp_error SMTP error array (reference) |
| | | * @param string $body_file Location of file with saved message body (reference) |
| | | * @param array $smtp_opts SMTP options (e.g. DSN request) |
| | | * |
| | | * @return boolean Send status. |
| | | */ |
| | | function rcmail_deliver_message(&$message, $from, $mailto, &$smtp_error, &$body_file) |
| | | function rcmail_deliver_message(&$message, $from, $mailto, &$smtp_error, &$body_file, $smtp_opts=null) |
| | | { |
| | | global $CONFIG, $RCMAIL; |
| | | |
| | |
| | | if (!is_object($RCMAIL->smtp)) |
| | | $RCMAIL->smtp_init(true); |
| | | |
| | | $sent = $RCMAIL->smtp->send_mail($from, $a_recipients, $smtp_headers, $msg_body); |
| | | $sent = $RCMAIL->smtp->send_mail($from, $a_recipients, $smtp_headers, $msg_body, $smtp_opts); |
| | | $smtp_response = $RCMAIL->smtp->get_response(); |
| | | $smtp_error = $RCMAIL->smtp->get_error(); |
| | | |
| | |
| | | $delim = $RCMAIL->config->header_delimiter(); |
| | | $to = $headers_enc['To']; |
| | | $subject = $headers_enc['Subject']; |
| | | $header_str = rtrim($header_str); |
| | | |
| | | if ($delim != "\r\n") { |
| | | $header_str = str_replace("\r\n", $delim, $header_str); |
| | |
| | | return $date; |
| | | } |
| | | |
| | | // Fixes some content-type names |
| | | function rcmail_fix_mimetype($name) |
| | | { |
| | | // Some versions of Outlook create garbage Content-Type: |
| | | // application/pdf.A520491B_3BF7_494D_8855_7FAC2C6C0608 |
| | | if (preg_match('/^application\/pdf.+/', $name)) |
| | | $name = 'application/pdf'; |
| | | |
| | | return $name; |
| | | } |
| | | |
| | | function rcmail_search_filter($attrib) |
| | | { |