| | |
| | | require_once('lib/enriched.inc'); |
| | | require_once('include/rcube_smtp.inc'); |
| | | |
| | | |
| | | $EMAIL_ADDRESS_PATTERN = '/([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9]([a-z0-9\-][.]?)*[a-z0-9]\\.[a-z]{2,5})/i'; |
| | | |
| | | if (empty($_SESSION['mbox'])) |
| | | $_SESSION['mbox'] = $IMAP->get_mailbox_name(); |
| | | // actions that do not require imap connection |
| | | $NOIMAP_ACTIONS = array('spell', 'addcontact', 'autocomplete', 'upload', 'display-attachment', 'remove-attachment'); |
| | | |
| | | |
| | | // log in to imap server |
| | | if (!in_array($RCMAIL->action, $NOIMAP_ACTIONS) && !$RCMAIL->imap_connect()) { |
| | | $RCMAIL->kill_session(); |
| | | |
| | | if ($OUTPUT->ajax_call) |
| | | $OUTPUT->redirect(array(), 2000); |
| | | |
| | | $OUTPUT->set_env('task', 'login'); |
| | | $OUTPUT->send('login'); |
| | | } |
| | | |
| | | |
| | | // set imap properties and session vars |
| | | if ($mbox = get_input_value('_mbox', RCUBE_INPUT_GPC)) |
| | | $IMAP->set_mailbox(($_SESSION['mbox'] = $mbox)); |
| | | else |
| | | $_SESSION['mbox'] = $IMAP->get_mailbox_name(); |
| | | |
| | | if (!empty($_GET['_page'])) |
| | | $IMAP->set_page(($_SESSION['page'] = intval($_GET['_page']))); |
| | | |
| | | // set mailbox to INBOX if not set |
| | | if (empty($_SESSION['mbox'])) |
| | | $_SESSION['mbox'] = $IMAP->get_mailbox_name(); |
| | | |
| | | // set default sort col/order to session |
| | | if (!isset($_SESSION['sort_col'])) |
| | |
| | | // set main env variables, labels and page title |
| | | if (empty($RCMAIL->action) || $RCMAIL->action == 'list') |
| | | { |
| | | $mbox_name = $IMAP->get_mailbox_name(); |
| | | |
| | | if (empty($RCMAIL->action)) |
| | | { |
| | | // initialize searching result if search_filter is used |
| | | 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(); |
| | | $OUTPUT->set_env('search_request', $search_request); |
| | | } |
| | | |
| | | // make sure the message count is refreshed (for default view) |
| | | $IMAP->messagecount($mbox_name, 'ALL', true); |
| | | } |
| | | |
| | | // set current mailbox in client environment |
| | | $OUTPUT->set_env('mailbox', $IMAP->get_mailbox_name()); |
| | | $OUTPUT->set_env('mailbox', $mbox_name); |
| | | $OUTPUT->set_env('quota', $IMAP->get_capability('quota')); |
| | | $OUTPUT->set_env('delimiter', $IMAP->get_hierarchy_delimiter()); |
| | | |
| | |
| | | if (!$OUTPUT->ajax_call) |
| | | $OUTPUT->add_label('checkingmail', 'deletemessage', 'movemessagetotrash', 'movingmessage'); |
| | | |
| | | $OUTPUT->set_pagetitle(rcmail_localize_foldername($IMAP->get_mailbox_name())); |
| | | $OUTPUT->set_pagetitle(rcmail_localize_foldername($mbox_name)); |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | $out = '<table' . $attrib_str . ">\n"; |
| | | |
| | | // define list of cols to be displayed |
| | | $a_show_cols = is_array($CONFIG['list_cols']) ? $CONFIG['list_cols'] : array('subject'); |
| | | // define list of cols to be displayed based on parameter or config |
| | | if (empty($attrib['columns'])) |
| | | $a_show_cols = is_array($CONFIG['list_cols']) ? $CONFIG['list_cols'] : array('subject'); |
| | | else |
| | | $a_show_cols = explode(',', strip_quotes($attrib['columns'])); |
| | | |
| | | // store column list in a session-variable |
| | | $_SESSION['list_columns'] = $a_show_cols; |
| | | |
| | | // define sortable columns |
| | | $a_sort_cols = array('subject', 'date', 'from', 'to', 'size'); |
| | | |
| | | $mbox = $IMAP->get_mailbox_name(); |
| | |
| | | $out .= '<col class="icon" />'; |
| | | |
| | | foreach ($a_show_cols as $col) |
| | | $out .= sprintf('<col class="%s" />', $col); |
| | | $out .= ($col!='attachment') ? sprintf('<col class="%s" />', $col) : '<col class="icon" />'; |
| | | |
| | | $out .= '<col class="icon" />'; |
| | | $out .= "</colgroup>\n"; |
| | | |
| | | // add table title |
| | |
| | | foreach ($a_show_cols as $col) |
| | | { |
| | | // get column name |
| | | $col_name = $col != 'flag' ? Q(rcube_label($col)) : sprintf($image_tag, $skin_path, $attrib['unflaggedicon'], ''); |
| | | switch ($col) |
| | | { |
| | | case 'flag': |
| | | $col_name = sprintf($image_tag, $skin_path, $attrib['unflaggedicon'], ''); |
| | | break; |
| | | case 'attachment': |
| | | $col_name = sprintf($image_tag, $skin_path, $attrib['attachmenticon'], ''); |
| | | break; |
| | | default: |
| | | $col_name = Q(rcube_label($col)); |
| | | } |
| | | |
| | | // make sort links |
| | | $sort = ''; |
| | |
| | | $sort_class = $col==$sort_col ? " sorted$sort_order" : ''; |
| | | |
| | | // put it all together |
| | | $out .= '<td class="'.$col.$sort_class.'" id="rcmHead'.$col.'">' . "$col_name$sort</td>\n"; |
| | | if ($col!='attachment') |
| | | $out .= '<td class="'.$col.$sort_class.'" id="rcm'.$col.'">' . "$col_name$sort</td>\n"; |
| | | else |
| | | $out .= '<td class="icon" id="rcm'.$col.'">' . "$col_name$sort</td>\n"; |
| | | } |
| | | |
| | | $out .= '<td class="icon">'.($attrib['attachmenticon'] ? sprintf($image_tag, $skin_path, $attrib['attachmenticon'], '') : ' ')."</td>\n"; |
| | | $out .= "</tr></thead>\n<tbody>\n"; |
| | | |
| | | // no messages in this mailbox |
| | |
| | | $flagged_icon = $attrib['unflaggedicon']; |
| | | |
| | | // set attachment icon |
| | | if ($attrib['attachmenticon'] && preg_match("/multipart\/[mr]/i", $header->ctype)) |
| | | if ($attrib['attachmenticon'] && preg_match("/multipart\/m/i", $header->ctype)) |
| | | $attach_icon = $attrib['attachmenticon']; |
| | | |
| | | $out .= sprintf('<tr id="rcmrow%d" class="message%s%s%s%s">'."\n", |
| | |
| | | else |
| | | $cont = Q($header->$col); |
| | | |
| | | $out .= '<td class="'.$col.'">' . $cont . "</td>\n"; |
| | | if ($col!='attachment') |
| | | $out .= '<td class="'.$col.'">' . $cont . "</td>\n"; |
| | | else |
| | | $out .= sprintf("<td class=\"icon\">%s</td>\n", $attach_icon ? sprintf($image_tag, $skin_path, $attach_icon, '') : ' '); |
| | | } |
| | | |
| | | $out .= sprintf("<td class=\"icon\">%s</td>\n", $attach_icon ? sprintf($image_tag, $skin_path, $attach_icon, '') : ''); |
| | | $out .= "</tr>\n"; |
| | | |
| | | if (sizeof($js_row_arr)) |
| | |
| | | |
| | | // complete message table |
| | | $out .= "</tbody></table>\n"; |
| | | |
| | | |
| | | $message_count = $IMAP->messagecount(); |
| | | |
| | |
| | | { |
| | | global $CONFIG, $IMAP, $OUTPUT; |
| | | |
| | | $a_show_cols = is_array($CONFIG['list_cols']) ? $CONFIG['list_cols'] : array('subject'); |
| | | if (empty($_SESSION['list_columns'])) |
| | | $a_show_cols = is_array($CONFIG['list_cols']) ? $CONFIG['list_cols'] : array('subject'); |
| | | else |
| | | $a_show_cols = $_SESSION['list_columns']; |
| | | |
| | | $mbox = $IMAP->get_mailbox_name(); |
| | | |
| | | // show 'to' instead of from in sent messages |
| | |
| | | |
| | | if (!empty($header->charset)) |
| | | $IMAP->set_charset($header->charset); |
| | | |
| | | // remove 'attachment' and '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]); |
| | | |
| | | // format each col; similar as in rcmail_message_list() |
| | | foreach ($a_show_cols as $col) |
| | |
| | | |
| | | // special replacements (not properly handled by washtml class) |
| | | $html_search = array( |
| | | '/(<\/nobr>)(\s+)(<nobr>)/i', // space(s) between <NOBR> |
| | | '/(<[\/]*st1:[^>]+>)/i', // Microsoft's Smart Tags <ST1> |
| | | '/<title>.*<\/title>/i', // PHP bug #32547 workaround: remove title tag |
| | | '/<html[^>]*>/im', // malformed html: remove html tags (#1485139) |
| | | '/<\/html>/i', // malformed html: remove html tags (#1485139) |
| | | '/(<\/nobr>)(\s+)(<nobr>)/i', // space(s) between <NOBR> |
| | | '/(<[\/]*st1:[^>]+>)/i', // Microsoft's Smart Tags <ST1> |
| | | '/<title>.*<\/title>/i', // PHP bug #32547 workaround: remove title tag |
| | | '/<html[^>]*>/im', // malformed html: remove html tags (#1485139) |
| | | '/<\/html>/i', // malformed html: remove html tags (#1485139) |
| | | '/^[\xFE\xFF\xBB\xBF\x00]+((?:<\!doctype|\<html))/im', // remove byte-order mark (only outlook?) |
| | | ); |
| | | $html_replace = array( |
| | | '\\1'.' '.'\\3', |
| | | '', |
| | | '', |
| | | '', |
| | | '', |
| | | '\\1'.' '.'\\3', |
| | | '', |
| | | '', |
| | | '', |
| | | '\\1', |
| | | '', |
| | | ); |
| | | $html = preg_replace($html_search, $html_replace, $html); |
| | | |
| | | // charset was converted to UTF-8 in rcube_imap::get_message_part() -> change charset specification in HTML accordingly |
| | | if (preg_match('/(\s+content=[\'"]\w+\/\w+;\s*charset)=([a-z0-9-_]+)/i', $html)) |
| | | $html = preg_replace('/(\s+content=[\'"]\w+\/\w+;\s*charset)=([a-z0-9-_]+)/i', '\\1='.RCMAIL_CHARSET, $html); |
| | | $charset_pattern = '/(\s+content=[\'"]?\w+\/\w+;\s*charset)=([a-z0-9-_]+)/i'; |
| | | if (preg_match($charset_pattern, $html)) { |
| | | $html = preg_replace($charset_pattern, '\\1='.RCMAIL_CHARSET, $html); |
| | | } |
| | | else { |
| | | // add head for malformed messages, washtml cannot work without that |
| | | if (!preg_match('/<head[^>]*>(.*)<\/head>/Uims', $html)) |
| | | $html = '<head></head>'. $html; |
| | | $html = substr_replace($html, '<meta http-equiv="Content-Type" content="text/html; charset='.RCMAIL_CHARSET.'" />', intval(stripos($html, '</head>')), 0); |
| | | $html = substr_replace($html, '<meta http-equiv="content-type" content="text/html; charset='.RCMAIL_CHARSET.'" />', intval(stripos($html, '<head>')+6), 0); |
| | | } |
| | | |
| | | // clean HTML with washhtml by Frederic Motte |
| | |
| | | html::img(array( |
| | | 'src' => $CONFIG['skin_path'] . $addicon, |
| | | 'alt' => "Add contact", |
| | | 'border' => 0, |
| | | ))); |
| | | } |
| | | } |
| | |
| | | */ |
| | | function rcmail_deliver_message(&$message, $from, $mailto) |
| | | { |
| | | global $CONFIG; |
| | | global $CONFIG, $RCMAIL; |
| | | |
| | | $msg_body = $message->get(); |
| | | $headers = $message->headers(); |
| | |
| | | unset($headers['Return-Receipt-To'], $headers['Disposition-Notification-To']); |
| | | |
| | | if ($CONFIG['smtp_log']) |
| | | write_log('sendmail', sprintf("[%s] User: %d on %s; Message for %s; %s", |
| | | date("d-M-Y H:i:s O", mktime()), |
| | | $_SESSION['user_id'], |
| | | write_log('sendmail', sprintf("User %s [%s]; Message for %s; %s", |
| | | $RCMAIL->user->get_username(), |
| | | $_SERVER['REMOTE_ADDR'], |
| | | $mailto, |
| | | !empty($smtp_response) ? join('; ', $smtp_response) : '')); |
| | |
| | | } |
| | | |
| | | |
| | | function rcmail_search_filter($attrib) |
| | | { |
| | | global $OUTPUT; |
| | | |
| | | if (!strlen($attrib['id'])) |
| | | $attrib['id'] = 'rcmlistfilter'; |
| | | |
| | | $attrib['onchange'] = JS_OBJECT_NAME.'.filter_mailbox(this.value)'; |
| | | |
| | | /* |
| | | RFC3501 (6.4.4): 'ALL', 'RECENT', |
| | | 'ANSWERED', 'DELETED', 'FLAGGED', 'SEEN', |
| | | 'UNANSWERED', 'UNDELETED', 'UNFLAGGED', 'UNSEEN', |
| | | 'NEW', // = (RECENT UNSEEN) |
| | | 'OLD' // = NOT RECENT |
| | | */ |
| | | |
| | | $select_filter = new html_select($attrib); |
| | | $select_filter->add(rcube_label('all'), 'ALL'); |
| | | $select_filter->add(rcube_label('unread'), 'UNSEEN'); |
| | | $select_filter->add(rcube_label('flagged'), 'FLAGGED'); |
| | | $select_filter->add(rcube_label('unanswered'), 'UNANSWERED'); |
| | | |
| | | $out = $select_filter->show($_SESSION['search_filter']); |
| | | |
| | | $OUTPUT->add_gui_object('search_filter', $attrib['id']); |
| | | |
| | | return $out; |
| | | } |
| | | |
| | | // register UI objects |
| | | $OUTPUT->add_handlers(array( |
| | | 'mailboxlist' => 'rcmail_mailbox_list', |
| | |
| | | 'messagecontentframe' => 'rcmail_messagecontent_frame', |
| | | 'messagepartframe' => 'rcmail_message_part_frame', |
| | | 'messagepartcontrols' => 'rcmail_message_part_controls', |
| | | 'searchfilter' => 'rcmail_search_filter', |
| | | 'searchform' => array($OUTPUT, 'search_form'), |
| | | )); |
| | | |