⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compose.inc

📁 开源邮件管理系统
💻 INC
📖 第 1 页 / 共 2 页
字号:
<?php/* +-----------------------------------------------------------------------+ | program/steps/mail/compose.inc                                        | |                                                                       | | This file is part of the RoundCube Webmail client                     | | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 | | Licensed under the GNU GPL                                            | |                                                                       | | PURPOSE:                                                              | |   Compose a new mail message with all headers and attachments         | |                                                                       | +-----------------------------------------------------------------------+ | Author: Thomas Bruederli <roundcube@gmail.com>                        | +-----------------------------------------------------------------------+ $Id: compose.inc 1493 2008-06-08 18:17:09Z alec $*/// define constants for message compose modedefine('RCUBE_COMPOSE_REPLY', 0x0106);define('RCUBE_COMPOSE_FORWARD', 0x0107);define('RCUBE_COMPOSE_DRAFT', 0x0108);// remove an attachmentif ($RCMAIL->action=='remove-attachment' && preg_match('/^rcmfile([0-9]+)$/', $_POST['_file'], $regs)){  $id = $regs[1];  if (is_array($_SESSION['compose']['attachments'][$id]))  {    @unlink($_SESSION['compose']['attachments'][$id]['path']);    $_SESSION['compose']['attachments'][$id] = NULL;    $OUTPUT->command('remove_from_attachment_list', "rcmfile$id");    $OUTPUT->send();    exit;  }}if ($RCMAIL->action=='display-attachment' && preg_match('/^rcmfile([0-9]+)$/', $_GET['_file'], $regs)){  $id = $regs[1];  if (is_array($_SESSION['compose']['attachments'][$id]))  {    $apath = $_SESSION['compose']['attachments'][$id]['path'];    header('Content-Type: ' . $_SESSION['compose']['attachments'][$id]['mimetype']);    header('Content-Length: ' . filesize($apath));    readfile($apath);  }  exit;}$MESSAGE_FORM = NULL;$MESSAGE = NULL;// 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).// Since there are many ways to leave the compose page improperly, it seems necessary to clean-up an old// compose when a "new/forward/reply/draft" is called - otherwise the old session attachments will appearif (!is_array($_SESSION['compose']) || $_SESSION['compose']['id'] != get_input_value('_id', RCUBE_INPUT_GET)){  rcmail_compose_cleanup();  $_SESSION['compose'] = array('id' => uniqid(rand()));}// add some labels to clientrcube_add_label('nosubject', 'norecipientwarning', 'nosubjectwarning', 'nobodywarning', 'notsentwarning', 'savingmessage', 'sendingmessage', 'messagesaved', 'converting');// add config parameter to client script$OUTPUT->set_env('draft_autosave', !empty($CONFIG['drafts_mbox']) ? $CONFIG['draft_autosave'] : 0);// get reference message and set compose modeif ($msg_uid = get_input_value('_reply_uid', RCUBE_INPUT_GET))  $compose_mode = RCUBE_COMPOSE_REPLY;else if ($msg_uid = get_input_value('_forward_uid', RCUBE_INPUT_GET))  $compose_mode = RCUBE_COMPOSE_FORWARD;else if ($msg_uid = get_input_value('_draft_uid', RCUBE_INPUT_GET))  $compose_mode = RCUBE_COMPOSE_DRAFT;if (!empty($msg_uid)){  // similar as in program/steps/mail/show.inc  $MESSAGE = new rcube_message($msg_uid);    if (!empty($MESSAGE->headers->charset))    $IMAP->set_charset($MESSAGE->headers->charset);      if ($compose_mode == RCUBE_COMPOSE_REPLY)  {    $_SESSION['compose']['reply_uid'] = $msg_uid;    $_SESSION['compose']['reply_msgid'] = $MESSAGE->headers->messageID;    $_SESSION['compose']['references']  = trim($MESSAGE->headers->references . " " . $MESSAGE->headers->messageID);    if (!empty($_GET['_all']))      $MESSAGE->reply_all = 1;  }  else if ($compose_mode == RCUBE_COMPOSE_FORWARD)  {    $_SESSION['compose']['forward_uid'] = $msg_uid;  }  else if ($compose_mode == RCUBE_COMPOSE_DRAFT)  {    $_SESSION['compose']['draft_uid'] = $msg_uid;  }}/****** compose mode functions ********/function rcmail_compose_headers($attrib){  global $IMAP, $MESSAGE, $DB, $compose_mode;  static $sa_recipients = array();  list($form_start, $form_end) = get_form_tags($attrib);    $out = '';  $part = strtolower($attrib['part']);    switch ($part)  {    case 'from':      return rcmail_compose_header_from($attrib);    case 'to':      $fname = '_to';      $header = 'to';            // we have a set of recipients stored is session      if (($mailto_id = get_input_value('_mailto', RCUBE_INPUT_GET)) && $_SESSION['mailto'][$mailto_id])        $fvalue = $_SESSION['mailto'][$mailto_id];      else if (!empty($_GET['_to']))        $fvalue = get_input_value('_to', RCUBE_INPUT_GET);            case 'cc':      if (!$fname)      {        $fname = '_cc';        $header = 'cc';      }    case 'bcc':      if (!$fname)      {        $fname = '_bcc';        $header = 'bcc';      }              $allow_attrib = array('id', 'class', 'style', 'cols', 'rows', 'tabindex');      $field_type = 'html_textarea';      break;    case 'replyto':    case 'reply-to':      $fname = '_replyto';      $allow_attrib = array('id', 'class', 'style', 'size', 'tabindex');      $field_type = 'html_inputfield';      break;      }   if ($fname && !empty($_POST[$fname]))    $fvalue = get_input_value($fname, RCUBE_INPUT_POST, TRUE);  else if ($header && $compose_mode == RCUBE_COMPOSE_REPLY)  {    // get recipent address(es) out of the message headers    if ($header=='to' && !empty($MESSAGE->headers->replyto))      $fvalue = $MESSAGE->headers->replyto;    else if ($header=='to' && !empty($MESSAGE->headers->from))      $fvalue = $MESSAGE->headers->from;    // add recipent of original message if reply to all    else if ($header=='cc' && !empty($MESSAGE->reply_all))    {      if ($v = $MESSAGE->headers->to)        $fvalue .= $v;      if ($v = $MESSAGE->headers->cc)        $fvalue .= (!empty($fvalue) ? ', ' : '') . $v;    }    // split recipients and put them back together in a unique way    if (!empty($fvalue))    {      $to_addresses = $IMAP->decode_address_list($fvalue);      $fvalue = '';      foreach ($to_addresses as $addr_part)      {        if (!empty($addr_part['mailto']) && !in_array($addr_part['mailto'], $sa_recipients) && (!$MESSAGE->compose_from || !in_array($addr_part['mailto'], $MESSAGE->compose_from)))        {          $fvalue .= (strlen($fvalue) ? ', ':'').$addr_part['string'];          $sa_recipients[] = $addr_part['mailto'];        }      }    }  }  else if ($header && $compose_mode == RCUBE_COMPOSE_DRAFT)  {    // get drafted headers    if ($header=='to' && !empty($MESSAGE->headers->to))      $fvalue = $MESSAGE->get_header('to');    if ($header=='cc' && !empty($MESSAGE->headers->cc))      $fvalue = $MESSAGE->get_header('cc');    if ($header=='bcc' && !empty($MESSAGE->headers->bcc))      $fvalue = $MESSAGE->get_header('bcc');  }          if ($fname && $field_type)  {    // pass the following attributes to the form class    $field_attrib = array('name' => $fname);    foreach ($attrib as $attr => $value)      if (in_array($attr, $allow_attrib))        $field_attrib[$attr] = $value;    // create teaxtarea object    $input = new $field_type($field_attrib);    $out = $input->show($fvalue);  }    if ($form_start)    $out = $form_start.$out;  return $out;  }function rcmail_compose_header_from($attrib){  global $IMAP, $MESSAGE, $DB, $USER, $OUTPUT, $compose_mode;      // pass the following attributes to the form class  $field_attrib = array('name' => '_from');  foreach ($attrib as $attr => $value)    if (in_array($attr, array('id', 'class', 'style', 'size', 'tabindex')))      $field_attrib[$attr] = $value;  // extract all recipients of the reply-message  $a_recipients = array();  if ($compose_mode == RCUBE_COMPOSE_REPLY && is_object($MESSAGE->headers))  {    $MESSAGE->compose_from = array();    $a_to = $IMAP->decode_address_list($MESSAGE->headers->to);    foreach ($a_to as $addr)    {      if (!empty($addr['mailto']))        $a_recipients[] = $addr['mailto'];    }    if (!empty($MESSAGE->headers->cc))    {      $a_cc = $IMAP->decode_address_list($MESSAGE->headers->cc);      foreach ($a_cc as $addr)      {        if (!empty($addr['mailto']))          $a_recipients[] = $addr['mailto'];      }    }  }  // get this user's identities  $sql_result = $USER->list_identities();  if ($DB->num_rows($sql_result))  {    $from_id = 0;    $a_signatures = array();    $field_attrib['onchange'] = JS_OBJECT_NAME.".change_identity(this)";    $select_from = new html_select($field_attrib);    while ($sql_arr = $DB->fetch_assoc($sql_result))    {      $identity_id = $sql_arr['identity_id'];      $select_from->add(format_email_recipient($sql_arr['email'], $sql_arr['name']), $identity_id);      // add signature to array      if (!empty($sql_arr['signature']))      {        $a_signatures[$identity_id]['text'] = $sql_arr['signature'];        $a_signatures[$identity_id]['is_html'] = ($sql_arr['html_signature'] == 1) ? true : false;        if ($a_signatures[$identity_id]['is_html'])        {            $h2t = new html2text($a_signatures[$identity_id]['text'], false, false);            $plainTextPart = $h2t->get_text();            $a_signatures[$identity_id]['plain_text'] = trim(html_entity_decode($plainTextPart, ENT_NOQUOTES, 'UTF-8'));        }      }      // set identity if it's one of the reply-message recipients      if (in_array($sql_arr['email'], $a_recipients))        $from_id = $sql_arr['identity_id'];      if ($compose_mode == RCUBE_COMPOSE_REPLY && is_array($MESSAGE->compose_from))        $MESSAGE->compose_from[] = $sql_arr['email'];      if ($compose_mode == RCUBE_COMPOSE_DRAFT && strstr($MESSAGE->headers->from, $sql_arr['email']))        $from_id = $sql_arr['identity_id'];    }    // overwrite identity selection with post parameter    if (isset($_POST['_from']))      $from_id = get_input_value('_from', RCUBE_INPUT_POST);    $out = $select_from->show($from_id);    // add signatures to client    $OUTPUT->set_env('signatures', $a_signatures);  }  else  {    $input_from = new html_inputfield($field_attrib);    $out = $input_from->show($_POST['_from']);  }    if ($form_start)    $out = $form_start.$out;  return $out;}function rcmail_compose_body($attrib){  global $RCMAIL, $CONFIG, $OUTPUT, $MESSAGE, $compose_mode;    list($form_start, $form_end) = get_form_tags($attrib);  unset($attrib['form']);    if (empty($attrib['id']))    $attrib['id'] = 'rcmComposeMessage';  $attrib['name'] = '_message';  if ($CONFIG['htmleditor'])    $isHtml = true;  else    $isHtml = false;  $body = '';  // use posted message body  if (!empty($_POST['_message']))  {    $body = get_input_value('_message', RCUBE_INPUT_POST, true);  }  else if ($compose_mode)  {    if ($isHtml && $MESSAGE->has_html_part())    {      $body = $MESSAGE->first_html_part();      $isHtml = true;    }    else    {      $body = $MESSAGE->first_text_part();      $isHtml = false;    }        // compose reply-body    if ($compose_mode == RCUBE_COMPOSE_REPLY)      $body = rcmail_create_reply_body($body, $isHtml);    // forward message body inline    else if ($compose_mode == RCUBE_COMPOSE_FORWARD)      $body = rcmail_create_forward_body($body, $isHtml);    // load draft message body    else if ($compose_mode == RCUBE_COMPOSE_DRAFT)      $body = rcmail_create_draft_body($body, $isHtml);  }  $tinylang = substr($_SESSION['language'], 0, 2);  if (!file_exists('program/js/tiny_mce/langs/'.$tinylang.'.js'))    $tinylang = 'en';   $OUTPUT->include_script('tiny_mce/tiny_mce.js');  $OUTPUT->include_script("editor.js");  $OUTPUT->add_script('rcmail_editor_init("$__skin_path", "'.$tinylang.'");');  $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) : ''));  $out .= $saveid->show();  $drafttoggle = new html_hiddenfield(array('name' => '_draft', 'value' => 'yes'));  $out .= $drafttoggle->show();  $msgtype = new html_hiddenfield(array('name' => '_is_html', 'value' => ($isHtml?"1":"0")));  $out .= $msgtype->show();  // If desired, set this text area to be editable by TinyMCE  if ($isHtml) $attrib['class'] = "mce_editor";  $textarea = new html_textarea($attrib);  $out .= $textarea->show($body);  $out .= $form_end ? "\n$form_end" : '';  // include GoogieSpell  if (!empty($CONFIG['enable_spellcheck']) && !$isHtml)    {    $lang_set = '';    if (!empty($CONFIG['spellcheck_languages']) && is_array($CONFIG['spellcheck_languages']))      $lang_set = "googie.setLanguages(".array2js($CONFIG['spellcheck_languages']).");\n";        $OUTPUT->include_script('googiespell.js');    $OUTPUT->add_script(sprintf(      "var googie = new GoogieSpell('\$__skin_path/images/googiespell/','%s&_action=spell&lang=');\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%s".      "googie.setCurrentLanguage('%s');\n".      "googie.decorateTextarea('%s');\n".      "%s.set_env('spellcheck', googie);",      $RCMAIL->comm_path,      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'))),      $lang_set,      substr($_SESSION['language'], 0, 2),      $attrib['id'],      JS_OBJECT_NAME), 'foot');

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -