summaryrefslogtreecommitdiff
path: root/program/lib/Mail
diff options
context:
space:
mode:
authorthomascube <thomas@roundcube.net>2006-09-08 12:34:25 +0000
committerthomascube <thomas@roundcube.net>2006-09-08 12:34:25 +0000
commit8acab006085216223111baccc19bc834807b62fc (patch)
tree6a6172f4878414ed1cd403f9fc9c8cf63f8de560 /program/lib/Mail
parent70d4b9a5dc39a7165e469aa3b4f24d49e9a20b9e (diff)
Fixed wrong header encoding (Bug #1483976)
Diffstat (limited to 'program/lib/Mail')
-rw-r--r--program/lib/Mail/mime.php61
1 files changed, 5 insertions, 56 deletions
diff --git a/program/lib/Mail/mime.php b/program/lib/Mail/mime.php
index 42842e3a4..9388a6525 100644
--- a/program/lib/Mail/mime.php
+++ b/program/lib/Mail/mime.php
@@ -826,65 +826,14 @@ class Mail_mime
default:
//quoted-printable encoding has been selected
- //Generate the header using the specified params and dynamicly
- //determine the maximum length of such strings.
- //75 is the value specified in the RFC. The -2 is there so
- //the later regexp doesn't break any of the translated chars.
- $prefix = '=?' . $this->_build_params['head_charset'] . '?Q?';
- $suffix = '?=';
- $maxLength = 75 - strlen($prefix . $suffix) - 2;
- $maxLength1stLine = $maxLength - strlen($hdr_name);
-
- //Replace all special characters used by the encoder.
- $search = array("=", "_", "?", " ");
- $replace = array("=3D", "=5F", "=3F", "_");
- $hdr_value = str_replace($search, $replace, $hdr_value);
-
- //Replace all extended characters (\x80-xFF) with their
- //ASCII values.
- $hdr_value = preg_replace(
- '#([\x80-\xFF])#e',
- '"=" . strtoupper(dechex(ord("\1")))',
- $hdr_value
- );
- //This regexp will break QP-encoded text at every $maxLength
- //but will not break any encoded letters.
- $reg1st = "|(.{0,$maxLength})[^\=]|";
- $reg2nd = "|(.{0,$maxLength})[^\=]|";
- break;
- }
- //Begin with the regexp for the first line.
- $reg = $reg1st;
- $output = "";
- while ($hdr_value) {
- //Split translated string at every $maxLength
- //But make sure not to break any translated chars.
- $found = preg_match($reg, $hdr_value, $matches);
-
- //After this first line, we need to use a different
- //regexp for the first line.
- $reg = $reg2nd;
-
- //Save the found part and encapsulate it in the
- //prefix & suffix. Then remove the part from the
- //$hdr_value variable.
- if ($found){
- $part = $matches[0];
- $hdr_value = substr($hdr_value, strlen($matches[0]));
- }else{
- $part = $hdr_value;
- $hdr_value = "";
+ preg_match_all('/(\w*[\x80-\xFF]+\w*)/', $hdr_value, $matches);
+ foreach ($matches[1] as $value) {
+ $replacement = preg_replace('/([\x80-\xFF])/e', '"=" . strtoupper(dechex(ord("\1")))', $value);
+ $hdr_value = str_replace($value, '=?' . $this->_build_params['head_charset'] . '?Q?' . $replacement . '?=', $hdr_value);
}
-
- //RFC 2047 specifies that any split header should be seperated
- //by a CRLF SPACE.
- if ($output){
- $output .= "\r\n ";
- }
- $output .= $prefix . $part . $suffix;
}
- $hdr_value = $output;
}
+
$input[$hdr_name] = $hdr_value;
}