| | |
| | | $MESSAGE = NULL; |
| | | |
| | | $COMPOSE_ID = get_input_value('_id', RCUBE_INPUT_GET); |
| | | $_SESSION['compose'] = $_SESSION['compose_data'][$COMPOSE_ID]; |
| | | $_SESSION['compose'] = $_SESSION['compose_data_'.$COMPOSE_ID]; |
| | | |
| | | // Nothing below is called during message composition, only at "new/forward/reply/draft" initialization or |
| | | // if a compose-ID is given (i.e. when the compose step is opened in a new window/tab). |
| | |
| | | if ($COMPOSE_ID) |
| | | raise_error(array('code' => 500, 'type' => 'php', |
| | | 'file' => __FILE__, 'line' => __LINE__, |
| | | 'message' => "Invalid session"), true, true); |
| | | 'message' => "Invalid compose ID"), true, true); |
| | | |
| | | $_SESSION['compose'] = array( |
| | | 'id' => uniqid(mt_rand()), |
| | |
| | | $OUTPUT->add_label('nosubject', 'nosenderwarning', 'norecipientwarning', 'nosubjectwarning', 'cancel', |
| | | 'nobodywarning', 'notsentwarning', 'notuploadedwarning', 'savingmessage', 'sendingmessage', |
| | | 'messagesaved', 'converting', 'editorwarning', 'searching', 'uploading', 'uploadingmany', |
| | | 'fileuploaderror', 'autocompletechars'); |
| | | 'fileuploaderror'); |
| | | |
| | | $OUTPUT->set_env('compose_id', $COMPOSE_ID); |
| | | |
| | |
| | | $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('autocomplete_min_length', $CONFIG['autocomplete_min_length']); |
| | | |
| | | // get reference message and set compose mode |
| | | if ($msg_uid = $_SESSION['compose']['param']['draft_uid']) { |
| | |
| | | // re-set 'prefer_html' to have possibility to use html part for compose |
| | | $CONFIG['prefer_html'] = $CONFIG['prefer_html'] || $CONFIG['htmleditor'] || $compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT; |
| | | $MESSAGE = new rcube_message($msg_uid); |
| | | |
| | | |
| | | // make sure message is marked as read |
| | | if ($MESSAGE && $MESSAGE->headers && !$MESSAGE->headers->seen) |
| | | if ($MESSAGE && $MESSAGE->headers && empty($MESSAGE->headers->flags['SEEN'])) |
| | | $IMAP->set_flag($msg_uid, 'SEEN'); |
| | | |
| | | if (!empty($MESSAGE->headers->charset)) |
| | | $IMAP->set_charset($MESSAGE->headers->charset); |
| | | |
| | | |
| | | if ($compose_mode == RCUBE_COMPOSE_REPLY) |
| | | { |
| | | $_SESSION['compose']['reply_uid'] = $msg_uid; |
| | |
| | | $MESSAGE->identities = $USER->list_identities(); |
| | | if (count($MESSAGE->identities)) |
| | | { |
| | | foreach ($MESSAGE->identities as $idx => $sql_arr) { |
| | | $email = mb_strtolower(rcube_idn_to_utf8($sql_arr['email'])); |
| | | $MESSAGE->identities[$idx]['email_ascii'] = $sql_arr['email']; |
| | | foreach ($MESSAGE->identities as $idx => $ident) { |
| | | $email = mb_strtolower(rcube_idn_to_utf8($ident['email'])); |
| | | |
| | | $MESSAGE->identities[$idx]['email_ascii'] = $ident['email']; |
| | | $MESSAGE->identities[$idx]['ident'] = format_email_recipient($ident['email'], $ident['name']); |
| | | $MESSAGE->identities[$idx]['email'] = $email; |
| | | } |
| | | } |
| | |
| | | else if (count($MESSAGE->identities)) { |
| | | // extract all recipients of the reply-message |
| | | $a_recipients = array(); |
| | | if ($compose_mode == RCUBE_COMPOSE_REPLY && is_object($MESSAGE->headers)) |
| | | if (is_object($MESSAGE->headers) && in_array($compose_mode, array(RCUBE_COMPOSE_REPLY, RCUBE_COMPOSE_FORWARD))) |
| | | { |
| | | $a_to = $IMAP->decode_address_list($MESSAGE->headers->to); |
| | | foreach ($a_to as $addr) { |
| | |
| | | } |
| | | |
| | | $from_idx = null; |
| | | $default_identity = 0; |
| | | $default_identity = null; |
| | | $return_path = $MESSAGE->headers->others['return-path']; |
| | | |
| | | // Select identity |
| | | foreach ($MESSAGE->identities as $idx => $sql_arr) { |
| | | foreach ($MESSAGE->identities as $idx => $ident) { |
| | | // save default identity ID |
| | | if ($sql_arr['standard']) { |
| | | if ($ident['standard']) { |
| | | $default_identity = $idx; |
| | | } |
| | | // we need ascii here |
| | | $email = $sql_arr['email_ascii']; |
| | | $ident = format_email_recipient($email, $sql_arr['name']); |
| | | |
| | | // select identity |
| | | // use From header |
| | | if (in_array($compose_mode, array(RCUBE_COMPOSE_DRAFT, RCUBE_COMPOSE_EDIT))) { |
| | | if ($MESSAGE->headers->from == $ident) { |
| | | if ($MESSAGE->headers->from == $ident['ident']) { |
| | | $from_idx = $idx; |
| | | break; |
| | | } |
| | | } |
| | | // reply to self, force To header value |
| | | else if ($compose_mode == RCUBE_COMPOSE_REPLY && $MESSAGE->headers->from == $ident) { |
| | | // reply to yourself |
| | | else if ($compose_mode == RCUBE_COMPOSE_REPLY && $MESSAGE->headers->from == $ident['ident']) { |
| | | $from_idx = $idx; |
| | | $MESSAGE->compose['to'] = $MESSAGE->headers->to; |
| | | break; |
| | | } |
| | | // set identity if it's one of the reply-message recipients |
| | | else if (in_array($email, $a_recipients) && ($from_idx === null || $sql_arr['standard'])) { |
| | | $from_idx = $idx; |
| | | } |
| | | // set identity when replying to mailing list |
| | | else if (strpos($return_path, str_replace('@', '=', $email).'@') !== false) { |
| | | // use replied message recipients |
| | | else if (in_array($ident['email_ascii'], $a_recipients)) { |
| | | $from_idx = $idx; |
| | | } |
| | | } |
| | | |
| | | // Still no ID, use first identity |
| | | // Fallback using Return-Path |
| | | if ($from_idx === null && $return_path) { |
| | | foreach ($MESSAGE->identities as $idx => $ident) { |
| | | if (strpos($return_path, str_replace('@', '=', $ident['email_ascii']).'@') !== false) { |
| | | $from_idx = $idx; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // Still no ID, use default/first identity |
| | | if ($from_idx === null) { |
| | | $from_idx = $default_identity; |
| | | $from_idx = $default_identity !== null ? $default_identity : key(reset($MESSAGE->identities)); |
| | | } |
| | | |
| | | $ident = $MESSAGE->identities[$from_idx]; |
| | |
| | | $mailfollowup = $MESSAGE->headers->others['mail-followup-to']; |
| | | $mailreplyto = $MESSAGE->headers->others['mail-reply-to']; |
| | | |
| | | if ($MESSAGE->compose['to']) |
| | | $fvalue = $MESSAGE->compose['to']; |
| | | else if ($MESSAGE->reply_all == 'list' && $mailfollowup) |
| | | if ($MESSAGE->reply_all == 'list' && $mailfollowup) |
| | | $fvalue = $mailfollowup; |
| | | else if ($MESSAGE->reply_all == 'list' |
| | | && preg_match('/<mailto:([^>]+)>/i', $MESSAGE->headers->others['list-post'], $m)) |
| | | $fvalue = $m[1]; |
| | | else if ($MESSAGE->reply_all && $mailfollowup) |
| | | $fvalue = $mailfollowup; |
| | | else if ($mailreplyto) |
| | | $fvalue = $mailreplyto; |
| | | else if (!empty($MESSAGE->headers->replyto)) |
| | |
| | | $mailto = mb_strtolower(rcube_idn_to_utf8($addr_part['mailto'])); |
| | | |
| | | if (!in_array($mailto, $a_recipients) |
| | | && (empty($MESSAGE->compose['from_email']) || $mailto != $MESSAGE->compose['from_email']) |
| | | && ($header == 'to' || empty($MESSAGE->compose['from_email']) || $mailto != $MESSAGE->compose['from_email']) |
| | | ) { |
| | | if ($addr_part['name'] && $addr_part['mailto'] != $addr_part['name']) |
| | | $string = format_email_recipient($mailto, $addr_part['name']); |
| | |
| | | $a_recipients[] = $addr_part['mailto']; |
| | | } |
| | | } |
| | | |
| | | |
| | | $fvalue = implode(', ', $fvalue); |
| | | } |
| | | |
| | |
| | | $input = new $field_type($field_attrib); |
| | | $out = $input->show($MESSAGE->compose[$param]); |
| | | } |
| | | |
| | | |
| | | if ($form_start) |
| | | $out = $form_start.$out; |
| | | |
| | | // configure autocompletion |
| | | rcube_autocomplete_init(); |
| | | |
| | | return $out; |
| | | } |
| | |
| | | $body); |
| | | } |
| | | } |
| | | |
| | | |
| | | $HTML_MODE = $isHtml; |
| | | |
| | | |
| | | return $body; |
| | | } |
| | | |
| | | function rcmail_compose_body($attrib) |
| | | { |
| | | global $RCMAIL, $CONFIG, $OUTPUT, $MESSAGE, $compose_mode, $LINE_LENGTH, $HTML_MODE, $MESSAGE_BODY; |
| | | |
| | | |
| | | list($form_start, $form_end) = get_form_tags($attrib); |
| | | unset($attrib['form']); |
| | | |
| | | |
| | | if (empty($attrib['id'])) |
| | | $attrib['id'] = 'rcmComposeBody'; |
| | | |
| | | $attrib['name'] = '_message'; |
| | | |
| | | $isHtml = $HTML_MODE; |
| | | |
| | | |
| | | $out = $form_start ? "$form_start\n" : ''; |
| | | |
| | | $saveid = new html_hiddenfield(array('name' => '_draft_saveid', 'value' => $compose_mode==RCUBE_COMPOSE_DRAFT ? str_replace(array('<','>'), "", $MESSAGE->headers->messageID) : '')); |
| | |
| | | |
| | | // include HTML editor |
| | | rcube_html_editor(); |
| | | |
| | | |
| | | // include GoogieSpell |
| | | if (!empty($CONFIG['enable_spellcheck'])) { |
| | | |
| | | $engine = $RCMAIL->config->get('spellcheck_engine','googie'); |
| | | $engine = $RCMAIL->config->get('spellcheck_engine','googie'); |
| | | $dictionary = (bool) $RCMAIL->config->get('spellcheck_dictionary'); |
| | | $spellcheck_langs = (array) $RCMAIL->config->get('spellcheck_languages', |
| | | array('da'=>'Dansk', 'de'=>'Deutsch', 'en' => 'English', 'es'=>'Español', |
| | | 'fr'=>'Français', 'it'=>'Italiano', 'nl'=>'Nederlands', 'pl'=>'Polski', |
| | |
| | | foreach ($spellcheck_langs as $key => $name) { |
| | | $editor_lang_set[] = ($key == $lang ? '+' : '') . JQ($name).'='.JQ($key); |
| | | } |
| | | |
| | | |
| | | $OUTPUT->include_script('googiespell.js'); |
| | | $OUTPUT->add_script(sprintf( |
| | | "var googie = new GoogieSpell('\$__skin_path/images/googiespell/','?_task=utils&_action=spell&lang=');\n". |
| | | "var googie = new GoogieSpell('\$__skin_path/images/googiespell/','?_task=utils&_action=spell&lang=', %s);\n". |
| | | "googie.lang_chck_spell = \"%s\";\n". |
| | | "googie.lang_rsm_edt = \"%s\";\n". |
| | | "googie.lang_close = \"%s\";\n". |
| | | "googie.lang_revert = \"%s\";\n". |
| | | "googie.lang_no_error_found = \"%s\";\n". |
| | | "googie.lang_learn_word = \"%s\";\n". |
| | | "googie.setLanguages(%s);\n". |
| | | "googie.setCurrentLanguage('%s');\n". |
| | | "googie.setSpellContainer('spellcheck-control');\n". |
| | | "googie.decorateTextarea('%s');\n". |
| | | "%s.set_env('spellcheck', googie);", |
| | | !empty($dictionary) ? 'true' : 'false', |
| | | JQ(Q(rcube_label('checkspelling'))), |
| | | JQ(Q(rcube_label('resumeediting'))), |
| | | JQ(Q(rcube_label('close'))), |
| | | JQ(Q(rcube_label('revertto'))), |
| | | JQ(Q(rcube_label('nospellerrors'))), |
| | | JQ(Q(rcube_label('addtodict'))), |
| | | json_serialize($spellcheck_langs), |
| | | $lang, |
| | | $attrib['id'], |
| | |
| | | $OUTPUT->add_label('checking'); |
| | | $OUTPUT->set_env('spellcheck_langs', join(',', $editor_lang_set)); |
| | | } |
| | | |
| | | |
| | | $out .= "\n".'<iframe name="savetarget" src="program/blank.gif" style="width:0;height:0;border:none;visibility:hidden;"></iframe>'; |
| | | |
| | | return $out; |
| | |
| | | |
| | | // build reply prefix |
| | | $from = array_pop($RCMAIL->imap->decode_address_list($MESSAGE->get_header('from'), 1, false)); |
| | | $prefix = sprintf("On %s, %s wrote:", |
| | | $MESSAGE->headers->date, $from['name'] ? $from['name'] : rcube_idn_to_utf8($from['mailto'])); |
| | | $prefix = rcube_label(array( |
| | | 'name' => 'mailreplyintro', |
| | | 'vars' => array( |
| | | 'date' => format_date($MESSAGE->headers->date, $RCMAIL->config->get('date_long')), |
| | | 'sender' => $from['name'] ? $from['name'] : rcube_idn_to_utf8($from['mailto']), |
| | | ) |
| | | )); |
| | | |
| | | if (!$bodyIsHtml) { |
| | | $body = preg_replace('/\r?\n/', "\n", $body); |
| | |
| | | |
| | | function rcmail_create_forward_body($body, $bodyIsHtml) |
| | | { |
| | | global $IMAP, $MESSAGE, $OUTPUT; |
| | | global $RCMAIL, $MESSAGE; |
| | | |
| | | // add attachments |
| | | if (!isset($_SESSION['compose']['forward_attachments']) && is_array($MESSAGE->mime_parts)) |
| | | $cid_map = rcmail_write_compose_attachments($MESSAGE, $bodyIsHtml); |
| | | |
| | | $date = format_date($MESSAGE->headers->date, $RCMAIL->config->get('date_long')); |
| | | $charset = $RCMAIL->output->get_charset(); |
| | | |
| | | if (!$bodyIsHtml) |
| | | { |
| | | $prefix = "\n\n\n-------- Original Message --------\n"; |
| | | $prefix .= 'Subject: ' . $MESSAGE->subject . "\n"; |
| | | $prefix .= 'Date: ' . $MESSAGE->headers->date . "\n"; |
| | | $prefix .= 'From: ' . $MESSAGE->get_header('from') . "\n"; |
| | | $prefix .= 'To: ' . $MESSAGE->get_header('to') . "\n"; |
| | | $prefix = "\n\n\n-------- " . rcube_label('originalmessage') . " --------\n"; |
| | | $prefix .= rcube_label('subject') . ': ' . $MESSAGE->subject . "\n"; |
| | | $prefix .= rcube_label('date') . ': ' . $date . "\n"; |
| | | $prefix .= rcube_label('from') . ': ' . $MESSAGE->get_header('from') . "\n"; |
| | | $prefix .= rcube_label('to') . ': ' . $MESSAGE->get_header('to') . "\n"; |
| | | |
| | | if ($MESSAGE->headers->cc) |
| | | $prefix .= 'Cc: ' . $MESSAGE->get_header('cc') . "\n"; |
| | | $prefix .= rcube_label('cc') . ': ' . $MESSAGE->get_header('cc') . "\n"; |
| | | if ($MESSAGE->headers->replyto && $MESSAGE->headers->replyto != $MESSAGE->headers->from) |
| | | $prefix .= 'Reply-To: ' . $MESSAGE->get_header('replyto') . "\n"; |
| | | $prefix .= rcube_label('replyto') . ': ' . $MESSAGE->get_header('replyto') . "\n"; |
| | | |
| | | $prefix .= "\n"; |
| | | } |
| | |
| | | $body = rcmail_wash_html($body, array('safe' => $MESSAGE->is_safe), $cid_map); |
| | | |
| | | $prefix = sprintf( |
| | | "<br /><p>-------- Original Message --------</p>" . |
| | | "<br /><p>-------- " . rcube_label('originalmessage') . " --------</p>" . |
| | | "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody>" . |
| | | "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">Subject: </th><td>%s</td></tr>" . |
| | | "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">Date: </th><td>%s</td></tr>" . |
| | | "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">From: </th><td>%s</td></tr>" . |
| | | "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">To: </th><td>%s</td></tr>", |
| | | Q($MESSAGE->subject), |
| | | Q($MESSAGE->headers->date), |
| | | htmlspecialchars(Q($MESSAGE->get_header('from'), 'replace'), ENT_COMPAT, $OUTPUT->get_charset()), |
| | | htmlspecialchars(Q($MESSAGE->get_header('to'), 'replace'), ENT_COMPAT, $OUTPUT->get_charset())); |
| | | "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">%s: </th><td>%s</td></tr>" . |
| | | "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">%s: </th><td>%s</td></tr>" . |
| | | "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">%s: </th><td>%s</td></tr>" . |
| | | "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">%s: </th><td>%s</td></tr>", |
| | | rcube_label('subject'), Q($MESSAGE->subject), |
| | | rcube_label('date'), Q($date), |
| | | rcube_label('from'), htmlspecialchars(Q($MESSAGE->get_header('from'), 'replace'), ENT_COMPAT, $charset), |
| | | rcube_label('to'), htmlspecialchars(Q($MESSAGE->get_header('to'), 'replace'), ENT_COMPAT, $charset)); |
| | | |
| | | if ($MESSAGE->headers->cc) |
| | | $prefix .= sprintf("<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">Cc: </th><td>%s</td></tr>", |
| | | htmlspecialchars(Q($MESSAGE->get_header('cc'), 'replace'), ENT_COMPAT, $OUTPUT->get_charset())); |
| | | $prefix .= sprintf("<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">%s: </th><td>%s</td></tr>", |
| | | rcube_label('cc'), |
| | | htmlspecialchars(Q($MESSAGE->get_header('cc'), 'replace'), ENT_COMPAT, $charset)); |
| | | |
| | | if ($MESSAGE->headers->replyto && $MESSAGE->headers->replyto != $MESSAGE->headers->from) |
| | | $prefix .= sprintf("<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">Reply-To: </th><td>%s</td></tr>", |
| | | htmlspecialchars(Q($MESSAGE->get_header('replyto'), 'replace'), ENT_COMPAT, $OUTPUT->get_charset())); |
| | | $prefix .= sprintf("<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">%s: </th><td>%s</td></tr>", |
| | | rcube_label('replyto'), |
| | | htmlspecialchars(Q($MESSAGE->get_header('replyto'), 'replace'), ENT_COMPAT, $charset)); |
| | | |
| | | $prefix .= "</tbody></table><br>"; |
| | | } |
| | | |
| | | |
| | | return $prefix.$body; |
| | | } |
| | | |
| | |
| | | function rcmail_create_draft_body($body, $bodyIsHtml) |
| | | { |
| | | global $MESSAGE, $OUTPUT; |
| | | |
| | | |
| | | /** |
| | | * add attachments |
| | | * sizeof($MESSAGE->mime_parts can be 1 - e.g. attachment, but no text! |
| | |
| | | if ($cid_map) |
| | | $body = str_replace(array_keys($cid_map), array_values($cid_map), $body); |
| | | } |
| | | |
| | | |
| | | return $body; |
| | | } |
| | | |
| | |
| | | } else if ($path) { |
| | | @unlink($path); |
| | | } |
| | | |
| | | |
| | | return false; |
| | | } |
| | | |
| | |
| | | unset($attachment['data'], $attachment['status'], $attachment['content_id'], $attachment['abort']); |
| | | return $attachment; |
| | | } |
| | | |
| | | |
| | | return false; |
| | | } |
| | | |
| | |
| | | |
| | | function rcmail_compose_attachment_form($attrib) |
| | | { |
| | | global $OUTPUT; |
| | | global $RCMAIL, $OUTPUT; |
| | | |
| | | // add ID if not given |
| | | if (!$attrib['id']) |
| | | $attrib['id'] = 'rcmUploadbox'; |
| | | |
| | | // find max filesize value |
| | | $max_filesize = parse_bytes(ini_get('upload_max_filesize')); |
| | | $max_postsize = parse_bytes(ini_get('post_max_size')); |
| | | if ($max_postsize && $max_postsize < $max_filesize) |
| | | $max_filesize = $max_postsize; |
| | | // Get filesize, enable upload progress bar |
| | | $max_filesize = rcube_upload_init(); |
| | | |
| | | $OUTPUT->set_env('max_filesize', $max_filesize); |
| | | $max_filesize = show_bytes($max_filesize); |
| | | |
| | | $button = new html_inputfield(array('type' => 'button')); |
| | | |
| | | |
| | | $out = html::div($attrib, |
| | | $OUTPUT->form_tag(array('name' => 'uploadform', 'method' => 'post', 'enctype' => 'multipart/form-data'), |
| | | html::div(null, rcmail_compose_attachment_field(array('size' => $attrib['attachmentfieldsize']))) . |
| | |
| | | ) |
| | | ) |
| | | ); |
| | | |
| | | |
| | | $OUTPUT->add_gui_object('uploadbox', $attrib['id']); |
| | | return $out; |
| | | } |