| program/steps/mail/get.inc |
| |
| This file is part of the RoundCube Webmail client |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland |
+ | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland |
| Licensed under the GNU GPL |
| |
| PURPOSE: |
| Author: Thomas Bruederli <roundcube@gmail.com> |
+-----------------------------------------------------------------------+
- $Id: get.inc 147 2006-02-20 23:29:14Z roundcube $
+ $Id: get.inc 2912 2009-09-04 10:38:18Z thomasb $
*/
-require_once('Mail/mimeDecode.php');
-
// show loading page
-if ($_GET['_preload'])
- {
+if (!empty($_GET['_preload'])) {
$url = str_replace('&_preload=1', '', $_SERVER['REQUEST_URI']);
$message = rcube_label('loadingdata');
- print "<html>\n<head>\n" .
- '<meta http-equiv="refresh" content="0; url='.$url.'">' .
- "\n</head>\n<body>" .
- $message .
- "\n</body>\n</html>";
+ header('Content-Type: text/html; charset=' . RCMAIL_CHARSET);
+ print "<html>\n<head>\n"
+ . '<meta http-equiv="refresh" content="0; url='.Q($url).'">' . "\n"
+ . '<meta http-equiv="content-type" content="text/html; charset='.RCMAIL_CHARSET.'">' . "\n"
+ . "</head>\n<body>\n$message\n</body>\n</html>";
exit;
- }
-
+}
+ob_end_clean();
// similar code as in program/steps/mail/show.inc
-if ($_GET['_uid'])
- {
- $MESSAGE = array();
- $MESSAGE['source'] = rcmail_message_source($_GET['_uid']);
-
- $mmd = new Mail_mimeDecode($MESSAGE['source']);
- $MESSAGE['structure'] = $mmd->decode(array('include_bodies' => TRUE,
- 'decode_headers' => FALSE,
- 'decode_bodies' => FALSE));
-
- $MESSAGE['parts'] = $mmd->getMimeNumbers($MESSAGE['structure']);
- }
-
+if (!empty($_GET['_uid'])) {
+ $RCMAIL->config->set('prefer_html', true);
+ $MESSAGE = new rcube_message(get_input_value('_uid', RCUBE_INPUT_GET));
+}
// show part page
-if ($_GET['_frame'])
- {
- parse_template('messagepart');
+if (!empty($_GET['_frame'])) {
+ $OUTPUT->send('messagepart');
exit;
+}
+
+else if ($pid = get_input_value('_part', RCUBE_INPUT_GET)) {
+ // TNEF encoded attachment part
+ if (preg_match('/^winmail\.([0-9.]+)\.([0-9]+)$/', $pid, $nt)) {
+ $pid = $nt[1]; $i = $nt[2];
+ if ($part = $MESSAGE->mime_parts[$pid]) {
+ $tnef_arr = $IMAP->tnef_decode($part, $MESSAGE->uid);
+ if (is_a($tnef_arr[$i], 'rcube_message_part'))
+ $MESSAGE->mime_parts[$pid] = $tnef_arr[$i];
+ }
}
-
-else if ($_GET['_part'])
- {
- if ($part = $MESSAGE['parts'][$_GET['_part']]);
- {
+
+ if ($part = $MESSAGE->mime_parts[$pid]) {
$ctype_primary = strtolower($part->ctype_primary);
$ctype_secondary = strtolower($part->ctype_secondary);
-
$mimetype = sprintf('%s/%s', $ctype_primary, $ctype_secondary);
- $filename = $part->d_parameters['filename'] ? $part->d_parameters['filename'] : $part->ctype_parameters['name'];
-
- if ($ctype_primary=='text' && $ctype_secondary=='html')
- {
- list($MESSAGE['parts']) = rcmail_parse_message($part,
- array('safe' => (bool)$_GET['_safe'],
- 'prefer_html' => TRUE,
- 'get_url' => $GET_URL.'&_part=%s'));
-
- $cont = rcmail_print_body($MESSAGE['parts'][0], (bool)$_GET['_safe']);
- }
- else
- $cont = $IMAP->mime_decode($part->body, $part->headers['content-transfer-encoding']);
+
+ $browser = new rcube_browser;
- // send correct headers for content type and length
- if ($_GET['_download'])
- {
- // send download headers
+ send_nocacheing_headers();
+
+ // send download headers
+ if ($_GET['_download']) {
header("Content-Type: application/octet-stream");
- header(sprintf('Content-Disposition: attachment; filename="%s"',
- $filename ? $filename : "roundcube.$ctype_secondary"));
- }
- else
- {
+ if ($browser->ie)
+ header("Content-Type: application/force-download");
+ }
+ else if ($ctype_primary == 'text') {
+ header("Content-Type: text/$ctype_secondary; charset=" . ($part->charset ? $part->charset : RCMAIL_CHARSET));
+ }
+ else {
header("Content-Type: $mimetype");
- header(sprintf('Content-Disposition: inline; filename="%s"', $filename));
- }
+ header("Content-Transfer-Encoding: binary");
+ }
- header(sprintf('Content-Length: %d', strlen($cont)));
+ // deliver part content
+ if ($ctype_primary == 'text' && $ctype_secondary == 'html') {
+ // get part body if not available
+ if (!$part->body)
+ $part->body = $MESSAGE->get_part_content($part->mime_id);
- // We need to set the following headers to make downloads work using IE in HTTPS mode.
- if (isset($_SERVER['HTTPS']))
- {
- header('Pragma: ');
- header('Cache-Control: ');
+ $OUTPUT = new rcube_html_page();
+ $OUTPUT->write(rcmail_print_body($part, array('safe' => $MESSAGE->is_safe, 'inline_html' => false)));
+ }
+ else {
+ // don't kill the connection if download takes more than 30 sec.
+ if (!ini_get('safe_mode')) {
+ set_time_limit(0);
}
+
+ $filename = $part->filename ? $part->filename : ($MESSAGE->subject ? $MESSAGE->subject : 'roundcube') . '.'.$ctype_secondary;
+
+ if ($browser->ie && $browser->ver < 7)
+ $filename = rawurlencode(abbreviate_string($filename, 55));
+ else if ($browser->ie)
+ $filename = rawurlencode($filename);
+ else
+ $filename = addcslashes($filename, '"');
+
+ $disposition = !empty($_GET['_download']) ? 'attachment' : 'inline';
+
+ header("Content-Disposition: $disposition; filename=\"$filename\"");
+
+ // turn off output buffering and print part content
+ if ($part->body)
+ echo $part->body;
+ else if ($part->size)
+ $IMAP->get_message_part($MESSAGE->uid, $part->mime_id, $part, true);
+ }
- // deliver part content
- echo $cont;
exit;
- }
}
+}
// print message
-else
- {
- $ctype_primary = strtolower($MESSAGE['structure']->ctype_primary);
- $ctype_secondary = strtolower($MESSAGE['structure']->ctype_secondary);
- $mimetype = sprintf('%s/%s', $ctype_primary, $ctype_secondary);
-
+else {
// send correct headers for content type
header("Content-Type: text/html");
- $cont = '';
- list($MESSAGE['parts']) = rcmail_parse_message($MESSAGE['structure'],
- array('safe' => (bool)$_GET['_safe'],
- 'get_url' => $GET_URL.'&_part=%s'));
-
- if ($MESSAGE['parts'] && $ctype_primary=='multipart')
- {
- // reset output page
- $OUTPUT = new rcube_html_page();
- parse_template('messagepart');
- exit;
- }
- else if ($MESSAGE['parts'][0])
- {
- $part = $MESSAGE['parts'][0];
- $cont = rcmail_print_body($part, (bool)$_GET['_safe']);
- }
- else
- $cont = $IMAP->get_body($_GET['_uid']);
+ $cont = "<html>\n<head><title></title>\n</head>\n<body>";
+ $cont .= rcmail_message_body(array());
+ $cont .= "\n</body>\n</html>";
$OUTPUT = new rcube_html_page();
$OUTPUT->write($cont);
-/*
- if ($mimetype=='text/html')
- print $cont;
- else
- {
- print "<html>\n<body>\n";
- print $cont;
- print "\n</body>\n</html>";
- }
-*/
exit;
- }
+}
// if we arrive here, the requested part was not found
header('HTTP/1.1 404 Not Found');
exit;
-?>
\ No newline at end of file
+?>