+/**
+ * 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 $RCMAIL, $EMAIL_FORMAT_ERROR, $RECIPIENT_COUNT;
+
+ // simplified email regexp, supporting quoted local part
+ $email_regexp = '(\S+|("[^"]+"))@\S+';
+
+ $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($delim, $mailto);
+
+ foreach($items as $item) {
+ $item = trim($item);
+ // address in brackets without name (do nothing)
+ if (preg_match('/^<'.$email_regexp.'>$/', $item)) {
+ $item = rcube_idn_to_ascii(trim($item, '<>'));
+ $result[] = '<' . $item . '>';
+ // address without brackets and without name (add brackets)
+ } else if (preg_match('/^'.$email_regexp.'$/', $item)) {
+ $item = rcube_idn_to_ascii($item);
+ $result[] = '<' . $item . '>';
+ // address with name (handle name)
+ } else if (preg_match('/<*'.$email_regexp.'>*$/', $item, $matches)) {
+ $address = $matches[0];
+ $name = trim(str_replace($address, '', $item), '" ');
+ $address = rcube_idn_to_ascii(trim($address, '<>'));
+ $result[] = format_email_recipient($address, $name);
+ $item = $address;
+ } else if (trim($item)) {
+ continue;
+ }