alecpl
2011-06-15 feac485000ada0ff9de9b1c6bcd2e4d8ab75b2f1
program/steps/mail/compose.inc
@@ -214,6 +214,9 @@
  {
    $_SESSION['compose']['forward_uid'] = $msg_uid;
    $OUTPUT->set_env('compose_mode', 'forward');
    if (!empty($_SESSION['compose']['param']['attachment']))
      $MESSAGE->forward_attachment = true;
  }
}
@@ -559,6 +562,13 @@
  else if ($_SESSION['compose']['param']['body']) {
    $body = $_SESSION['compose']['param']['body'];
    $isHtml = false;
  }
  // forward as attachment
  else if ($compose_mode == RCUBE_COMPOSE_FORWARD && $MESSAGE->forward_attachment) {
    $isHtml = rcmail_compose_editor_mode();
    $body = '';
    if (empty($_SESSION['compose']['attachments']))
      rcmail_write_forward_attachment($MESSAGE);
  }
  // reply/edit/draft/forward
  else if ($compose_mode) {
@@ -960,8 +970,61 @@
  return $cid_map;
}
// Creates an attachment from the forwarded message
function rcmail_write_forward_attachment(&$message)
{
  global $RCMAIL;
  if (strlen($message->subject)) {
    $name = mb_substr($message->subject, 0, 64) . '.eml';
  }
  else {
    $name = 'message_rfc822.eml';
  }
  $mem_limit = parse_bytes(ini_get('memory_limit'));
  $curr_mem = function_exists('memory_get_usage') ? memory_get_usage() : 16*1024*1024; // safe value: 16MB
  $data = $path = null;
  // don't load too big attachments into memory
  if ($mem_limit > 0 && $message->size > $mem_limit - $curr_mem) {
    $temp_dir = unslashify($RCMAIL->config->get('temp_dir'));
    $path = tempnam($temp_dir, 'rcmAttmnt');
    if ($fp = fopen($path, 'w')) {
      $RCMAIL->imap->get_raw_body($message->uid, $fp);
      fclose($fp);
    } else
      return false;
  } else {
    $data = $RCMAIL->imap->get_raw_body($message->uid);
  }
  $attachment = array(
    'group' => $_SESSION['compose']['id'],
    'name' => $name,
    'mimetype' => 'message/rfc822',
    'data' => $data,
    'path' => $path,
    'size' => $path ? filesize($path) : strlen($data),
  );
  $attachment = $RCMAIL->plugins->exec_hook('attachment_save', $attachment);
  if ($attachment['status']) {
    unset($attachment['data'], $attachment['status'], $attachment['content_id'], $attachment['abort']);
    $_SESSION['compose']['attachments'][$attachment['id']] = $attachment;
    return true;
  } else if ($path) {
    @unlink($path);
  }
  return false;
}
function rcmail_save_attachment(&$message, $pid)
{
  $rcmail = rcmail::get_instance();
  $part = $message->mime_parts[$pid];
  $mem_limit = parse_bytes(ini_get('memory_limit'));
  $curr_mem = function_exists('memory_get_usage') ? memory_get_usage() : 16*1024*1024; // safe value: 16MB
@@ -969,7 +1032,6 @@
  // don't load too big attachments into memory
  if ($mem_limit > 0 && $part->size > $mem_limit - $curr_mem) {
    $rcmail = rcmail::get_instance();
    $temp_dir = unslashify($rcmail->config->get('temp_dir'));
    $path = tempnam($temp_dir, 'rcmAttmnt');
    if ($fp = fopen($path, 'w')) {
@@ -991,7 +1053,7 @@
    'size' => $path ? filesize($path) : strlen($data),
  );
  $attachment = rcmail::get_instance()->plugins->exec_hook('attachment_save', $attachment);
  $attachment = $rcmail->plugins->exec_hook('attachment_save', $attachment);
  if ($attachment['status']) {
    unset($attachment['data'], $attachment['status'], $attachment['content_id'], $attachment['abort']);
@@ -1297,7 +1359,10 @@
function rcmail_store_target_selection($attrib)
{
  $attrib['name'] = '_store_target';
  $select = rcmail_mailbox_select(array_merge($attrib, array('noselection' => '- '.rcube_label('dontsave').' -')));
  $select = rcmail_mailbox_select(array_merge($attrib, array(
    'noselection' => '- '.rcube_label('dontsave').' -',
    'folder_filter' => 'mail'
  )));
  return $select->show($_SESSION['compose']['param']['sent_mbox'], $attrib);
}