Make email recipients separator configurable + suppress dupes in auto-completion
| | |
| | | CHANGELOG Roundcube Webmail |
| | | =========================== |
| | | |
| | | - Make email recipients separator configurable |
| | | - Fix so folders with \Noinferiors attribute aren't listed in parent selector |
| | | - Fix handling of curly brackets in URLs (#1488168) |
| | | - Fix handling of dates (birthday/anniversary) in contact data (#1488147) |
| | |
| | | | Main configuration file | |
| | | | | |
| | | | This file is part of the Roundcube Webmail client | |
| | | | Copyright (C) 2005-2010, The Roundcube Dev Team | |
| | | | Copyright (C) 2005-2011, The Roundcube Dev Team | |
| | | | Licensed under the GNU GPL | |
| | | | | |
| | | +-----------------------------------------------------------------------+ |
| | |
| | | // Makes that words with symbols will be ignored (e.g. g@@gle) |
| | | $rcmail_config['spellcheck_ignore_syms'] = false; |
| | | |
| | | // Use this char/string to separate recipients when composing a new message |
| | | $rcmail_config['recipients_separator'] = ','; |
| | | |
| | | // don't let users set pagesize to more than this value if set |
| | | $rcmail_config['max_pagesize'] = 200; |
| | | |
| | |
| | | |
| | | function rcube_webmail() |
| | | { |
| | | this.env = {}; |
| | | this.env = { recipients_separator:',', recipients_delimiter:', ' }; |
| | | this.labels = {}; |
| | | this.buttons = {}; |
| | | this.buttons_sel = {}; |
| | |
| | | |
| | | this.init_address_input_events = function(obj, props) |
| | | { |
| | | this.env.recipients_delimiter = this.env.recipients_separator + ' '; |
| | | |
| | | obj[bw.ie || bw.safari || bw.chrome ? 'keydown' : 'keypress'](function(e) { return ref.ksearch_keydown(e, this, props); }) |
| | | .attr('autocomplete', 'off'); |
| | | }; |
| | |
| | | |
| | | // insert all members of a group |
| | | if (typeof this.env.contacts[id] === 'object' && this.env.contacts[id].id) { |
| | | insert += this.env.contacts[id].name + ', '; |
| | | insert += this.env.contacts[id].name + this.env.recipients_delimiter; |
| | | this.group2expand = $.extend({}, this.env.contacts[id]); |
| | | this.group2expand.input = this.ksearch_input; |
| | | this.http_request('mail/group-expand', '_source='+urlencode(this.env.contacts[id].source)+'&_gid='+urlencode(this.env.contacts[id].id), false); |
| | | } |
| | | else if (typeof this.env.contacts[id] === 'string') { |
| | | insert = this.env.contacts[id] + ', '; |
| | | insert = this.env.contacts[id] + this.env.recipients_delimiter; |
| | | trigger = true; |
| | | } |
| | | |
| | |
| | | |
| | | // get string from current cursor pos to last comma |
| | | var cpos = this.get_caret_pos(this.ksearch_input), |
| | | p = inp_value.lastIndexOf(',', cpos-1), |
| | | p = inp_value.lastIndexOf(this.env.recipients_separator, cpos-1), |
| | | q = inp_value.substring(p+1, cpos), |
| | | min = this.env.autocomplete_min_length, |
| | | ac = this.ksearch_data; |
| | |
| | | $members[] = format_email_recipient($email, $sql_arr['name']); |
| | | } |
| | | |
| | | $OUTPUT->command('replace_group_recipients', $gid, join(', ', $members)); |
| | | $separator = trim($RCMAIL->config->get('recipients_separator', ',')) . ' '; |
| | | $OUTPUT->command('replace_group_recipients', $gid, join($separator, array_unique($members))); |
| | | } |
| | | |
| | | $OUTPUT->send(); |
| | |
| | | if ($email_cnt > 1 && stripos($contact, $search) === false) { |
| | | continue; |
| | | } |
| | | // when we've got more than one book, we need to skip duplicates |
| | | if ($books_num == 1 || !in_array($contact, $contacts)) { |
| | | // skip duplicates |
| | | if (!in_array($contact, $contacts)) { |
| | | $contacts[] = $contact; |
| | | if (count($contacts) >= $MAXNUM) |
| | | break 2; |
| | |
| | | | program/steps/mail/compose.inc | |
| | | | | |
| | | | This file is part of the Roundcube Webmail client | |
| | | | Copyright (C) 2005-2009, The Roundcube Dev Team | |
| | | | Copyright (C) 2005-2011, The Roundcube Dev Team | |
| | | | Licensed under the GNU GPL | |
| | | | | |
| | | | PURPOSE: | |
| | |
| | | } |
| | | // set current mailbox in client environment |
| | | $OUTPUT->set_env('mailbox', $IMAP->get_mailbox_name()); |
| | | $OUTPUT->set_env('sig_above', $CONFIG['sig_above']); |
| | | $OUTPUT->set_env('top_posting', $CONFIG['top_posting']); |
| | | $OUTPUT->set_env('sig_above', $RCMAIL->config->get('sig_above', false)); |
| | | $OUTPUT->set_env('top_posting', $RCMAIL->config->get('top_posting', false)); |
| | | $OUTPUT->set_env('recipients_separator', trim($RCMAIL->config->get('recipients_separator', ','))); |
| | | |
| | | // get reference message and set compose mode |
| | | if ($msg_uid = $_SESSION['compose']['param']['draft_uid']) { |
| | |
| | | // Set other headers |
| | | $a_recipients = array(); |
| | | $parts = array('to', 'cc', 'bcc', 'replyto', 'followupto'); |
| | | $separator = trim($RCMAIL->config->get('recipients_separator', ',')) . ' '; |
| | | |
| | | foreach ($parts as $header) { |
| | | $fvalue = ''; |
| | |
| | | if ($v = $MESSAGE->headers->to) |
| | | $fvalue .= $v; |
| | | if ($v = $MESSAGE->headers->cc) |
| | | $fvalue .= (!empty($fvalue) ? ', ' : '') . $v; |
| | | $fvalue .= (!empty($fvalue) ? $separator : '') . $v; |
| | | } |
| | | } |
| | | else if (in_array($compose_mode, array(RCUBE_COMPOSE_DRAFT, RCUBE_COMPOSE_EDIT))) { |
| | |
| | | } |
| | | } |
| | | |
| | | $fvalue = implode(', ', $fvalue); |
| | | $fvalue = implode($separator, $fvalue); |
| | | } |
| | | |
| | | $MESSAGE->compose[$header] = $fvalue; |
| | |
| | | | program/steps/mail/sendmail.inc | |
| | | | | |
| | | | This file is part of the Roundcube Webmail client | |
| | | | Copyright (C) 2005-2010, The Roundcube Dev Team | |
| | | | Copyright (C) 2005-2011, The Roundcube Dev Team | |
| | | | Licensed under the GNU GPL | |
| | | | | |
| | | | PURPOSE: | |
| | |
| | | return $body; |
| | | } |
| | | |
| | | // parse email address input (and count addresses) |
| | | /** |
| | | * Parse and cleanup email address input (and count addresses) |
| | | * |
| | | * @param string Address input |
| | | * @param boolean Do count recipients (saved in global $RECIPIENT_COUNT) |
| | | * @param boolean Validate addresses (errors saved in global $EMAIL_FORMAT_ERROR) |
| | | * @return string Canonical recipients string separated by comma |
| | | */ |
| | | function rcmail_email_input_format($mailto, $count=false, $check=true) |
| | | { |
| | | global $EMAIL_FORMAT_ERROR, $RECIPIENT_COUNT; |
| | | global $RCMAIL, $EMAIL_FORMAT_ERROR, $RECIPIENT_COUNT; |
| | | |
| | | // simplified email regexp, supporting quoted local part |
| | | $email_regexp = '(\S+|("[^"]+"))@\S+'; |
| | | |
| | | $regexp = array('/[,;]\s*[\r\n]+/', '/[\r\n]+/', '/[,;]\s*$/m', '/;/', '/(\S{1})(<'.$email_regexp.'>)/U'); |
| | | $replace = array(', ', ', ', '', ',', '\\1 \\2'); |
| | | $delim = trim($RCMAIL->config->get('recipients_separator', ',')); |
| | | $regexp = array("/[,;$delim]\s*[\r\n]+/", '/[\r\n]+/', "/[,;$delim]\s*\$/m", '/;/', '/(\S{1})(<'.$email_regexp.'>)/U'); |
| | | $replace = array($delim.' ', ', ', '', $delim, '\\1 \\2'); |
| | | |
| | | // replace new lines and strip ending ', ', make address input more valid |
| | | $mailto = trim(preg_replace($regexp, $replace, $mailto)); |
| | | |
| | | $result = array(); |
| | | $items = rcube_explode_quoted_string(',', $mailto); |
| | | $items = rcube_explode_quoted_string($delim, $mailto); |
| | | |
| | | foreach($items as $item) { |
| | | $item = trim($item); |
| | |
| | | // address with name (handle name) |
| | | } else if (preg_match('/<*'.$email_regexp.'>*$/', $item, $matches)) { |
| | | $address = $matches[0]; |
| | | $name = str_replace($address, '', $item); |
| | | $name = trim($name); |
| | | if ($name && ($name[0] != '"' || $name[strlen($name)-1] != '"') |
| | | && preg_match('/[\(\)\<\>\\\.\[\]@,;:"]/', $name)) { |
| | | $name = '"'.addcslashes($name, '"').'"'; |
| | | } |
| | | $name = trim(str_replace($address, '', $item), '" '); |
| | | $address = rcube_idn_to_ascii(trim($address, '<>')); |
| | | $address = '<' . $address . '>'; |
| | | |
| | | $result[] = $name.' '.$address; |
| | | $result[] = format_email_recipient($address, $name); |
| | | $item = $address; |
| | | } else if (trim($item)) { |
| | | continue; |