Add configurable default charset for message decoding

release-0.6
thomascube 17 years ago
parent 9814721e8d
commit 17b5fb797f

@ -1,6 +1,11 @@
CHANGELOG RoundCube Webmail CHANGELOG RoundCube Webmail
--------------------------- ---------------------------
2008/03/21 (thomasb)
----------
- Add configurable default charset for message decoding
2008/02/28 (thomasb) 2008/02/28 (thomasb)
---------- ----------
- Fix folder adding/renaming inspired by #1484800 - Fix folder adding/renaming inspired by #1484800

@ -180,6 +180,9 @@ $rcmail_config['flag_for_deletion'] = TRUE;
// 0 = ask the user, 1 = send automatically, 2 = ignore (never send or ask) // 0 = ask the user, 1 = send automatically, 2 = ignore (never send or ask)
$rcmail_config['mdn_requests'] = 0; $rcmail_config['mdn_requests'] = 0;
// Use this as charset as fallback for message decoding
$rcmail_config['default_charset'] = 'ISO-8859-1';
// Make use of the built-in spell checker. It is based on GoogieSpell. // Make use of the built-in spell checker. It is based on GoogieSpell.
// Since Google only accepts connections over https your PHP installatation // Since Google only accepts connections over https your PHP installatation
// requires to be compiled with Open SSL support // requires to be compiled with Open SSL support

@ -290,6 +290,9 @@ function rcmail_imap_init($connect=FALSE)
function rcmail_set_imap_prop() function rcmail_set_imap_prop()
{ {
global $CONFIG, $IMAP; global $CONFIG, $IMAP;
if (!empty($CONFIG['default_charset']))
$IMAP->set_charset($CONFIG['default_charset']);
// set root dir from config // set root dir from config
if (!empty($CONFIG['imap_root'])) if (!empty($CONFIG['imap_root']))

@ -51,6 +51,7 @@ class rcube_imap
var $sort_order = 'DESC'; var $sort_order = 'DESC';
var $delimiter = NULL; var $delimiter = NULL;
var $caching_enabled = FALSE; var $caching_enabled = FALSE;
var $default_charset = 'ISO-8859-1';
var $default_folders = array('INBOX'); var $default_folders = array('INBOX');
var $default_folders_lc = array('inbox'); var $default_folders_lc = array('inbox');
var $cache = array(); var $cache = array();
@ -203,6 +204,20 @@ class rcube_imap
} }
/**
* Set default message charset
*
* This will be used for message decoding if a charset specification is not available
*
* @param string Charset string
* @access public
*/
function set_charset($cs)
{
$this->default_charset = $ch;
}
/** /**
* This list of folders will be listed above all other folders * This list of folders will be listed above all other folders
* *
@ -1146,7 +1161,7 @@ class rcube_imap
// normalize filename property // normalize filename property
if ($filename_mime = $struct->d_parameters['filename'] ? $struct->d_parameters['filename'] : $struct->ctype_parameters['name']) if ($filename_mime = $struct->d_parameters['filename'] ? $struct->d_parameters['filename'] : $struct->ctype_parameters['name'])
$struct->filename = $this->decode_mime_string($filename_mime); $struct->filename = rcube_imap::decode_mime_string($filename_mime, $this->default_charset);
else if ($filename_encoded = $struct->d_parameters['filename*'] ? $struct->d_parameters['filename*'] : $struct->ctype_parameters['name*']) else if ($filename_encoded = $struct->d_parameters['filename*'] ? $struct->d_parameters['filename*'] : $struct->ctype_parameters['name*'])
{ {
// decode filename according to RFC 2231, Section 4 // decode filename according to RFC 2231, Section 4
@ -1154,7 +1169,7 @@ class rcube_imap
$struct->filename = rcube_charset_convert(urldecode($filename_urlencoded), $filename_charset); $struct->filename = rcube_charset_convert(urldecode($filename_urlencoded), $filename_charset);
} }
else if (!empty($struct->headers['content-description'])) else if (!empty($struct->headers['content-description']))
$struct->filename = $this->decode_mime_string($struct->headers['content-description']); $struct->filename = rcube_imap::decode_mime_string($struct->headers['content-description'], $this->default_charset);
return $struct; return $struct;
} }
@ -1241,9 +1256,9 @@ class rcube_imap
// convert charset (if text or message part) // convert charset (if text or message part)
if ($o_part->ctype_primary=='text' || $o_part->ctype_primary=='message') if ($o_part->ctype_primary=='text' || $o_part->ctype_primary=='message')
{ {
// assume ISO-8859-1 if no charset specified // assume default if no charset specified
if (empty($o_part->charset)) if (empty($o_part->charset))
$o_part->charset = 'ISO-8859-1'; $o_part->charset = $this->default_charset;
$body = rcube_charset_convert($body, $o_part->charset); $body = rcube_charset_convert($body, $o_part->charset);
} }
@ -2297,7 +2312,7 @@ class rcube_imap
*/ */
function decode_header($input, $remove_quotes=FALSE) function decode_header($input, $remove_quotes=FALSE)
{ {
$str = $this->decode_mime_string((string)$input); $str = rcube_imap::decode_mime_string((string)$input, $this->default_charset);
if ($str{0}=='"' && $remove_quotes) if ($str{0}=='"' && $remove_quotes)
$str = str_replace('"', '', $str); $str = str_replace('"', '', $str);
@ -2414,7 +2429,7 @@ class rcube_imap
return rcube_charset_convert($body, $ctype_param['charset']); return rcube_charset_convert($body, $ctype_param['charset']);
// defaults to what is specified in the class header // defaults to what is specified in the class header
return rcube_charset_convert($body, 'ISO-8859-1'); return rcube_charset_convert($body, $this->default_charset);
} }

@ -90,7 +90,11 @@ if (!empty($msg_uid))
// similar as in program/steps/mail/show.inc // similar as in program/steps/mail/show.inc
$MESSAGE = array('UID' => $msg_uid); $MESSAGE = array('UID' => $msg_uid);
$MESSAGE['headers'] = &$IMAP->get_headers($msg_uid); $MESSAGE['headers'] = &$IMAP->get_headers($msg_uid);
$MESSAGE['structure'] = &$IMAP->get_structure($msg_uid); $MESSAGE['structure'] = &$IMAP->get_structure($msg_uid);
if (!empty($MESSAGE['headers']->charset))
$IMAP->set_charset($MESSAGE['headers']->charset);
$MESSAGE['subject'] = $IMAP->decode_header($MESSAGE['headers']->subject); $MESSAGE['subject'] = $IMAP->decode_header($MESSAGE['headers']->subject);
$MESSAGE['parts'] = $IMAP->get_mime_numbers($MESSAGE['structure']); $MESSAGE['parts'] = $IMAP->get_mime_numbers($MESSAGE['structure']);

@ -30,6 +30,10 @@ if ($_GET['_uid'])
$MESSAGE = array('UID' => get_input_value('_uid', RCUBE_INPUT_GET)); $MESSAGE = array('UID' => get_input_value('_uid', RCUBE_INPUT_GET));
$MESSAGE['headers'] = $IMAP->get_headers($MESSAGE['UID']); $MESSAGE['headers'] = $IMAP->get_headers($MESSAGE['UID']);
// set message charset as default
if (!empty($MESSAGE['headers']->charset))
$IMAP->set_charset($MESSAGE['headers']->charset);
// go back to list if message not found (wrong UID) // go back to list if message not found (wrong UID)
if (!$MESSAGE['headers']) if (!$MESSAGE['headers'])
{ {

@ -5,7 +5,7 @@
| program/steps/mail/viewsource.inc | | program/steps/mail/viewsource.inc |
| | | |
| This file is part of the RoundCube Webmail client | | This file is part of the RoundCube Webmail client |
| Copyright (C) 2005-2007, RoundCube Dev. - Switzerland | | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland |
| Licensed under the GNU GPL | | Licensed under the GNU GPL |
| | | |
| PURPOSE: | | PURPOSE: |
@ -22,19 +22,21 @@
// similar code as in program/steps/mail/get.inc // similar code as in program/steps/mail/get.inc
if ($uid = get_input_value('_uid', RCUBE_INPUT_GET)) if ($uid = get_input_value('_uid', RCUBE_INPUT_GET))
{ {
header('Content-Type: text/plain'); $headers = $IMAP->get_headers($uid);
//@ob_end_clean(); $charset = $headers->charset ? $headers->charset : $IMAP->default_charset;
header("Content-Type: text/plain; charset={$charset}");
$IMAP->print_raw_body($uid); $IMAP->print_raw_body($uid);
} }
else else
{ {
raise_error(array('code' => 500, raise_error(array(
'type' => 'php', 'code' => 500,
'message' => 'Message UID '.$uid.' not found'), 'type' => 'php',
TRUE, 'message' => 'Message UID '.$uid.' not found'),
TRUE); true,
} true);
}
exit; exit;
?> ?>

Loading…
Cancel
Save