diff options
Diffstat (limited to 'program/lib/Mail')
-rw-r--r-- | program/lib/Mail/mime.php | 118 | ||||
-rw-r--r-- | program/lib/Mail/mimePart.php | 148 |
2 files changed, 135 insertions, 131 deletions
diff --git a/program/lib/Mail/mime.php b/program/lib/Mail/mime.php index 975ca48ce..fd9e2befa 100644 --- a/program/lib/Mail/mime.php +++ b/program/lib/Mail/mime.php @@ -332,17 +332,21 @@ class Mail_mime function addAttachment($file, $c_type = 'application/octet-stream', $name = '', - $isfile = true, + $isfile = true, $encoding = 'base64', $disposition = 'attachment', $charset = '', - $language = '', + $language = '', $location = '', - $n_encoding = NULL, - $f_encoding = NULL) + $n_encoding = NULL, + $f_encoding = NULL) { - $filedata = ($isfile === true) ? $this->_file2str($file) - : $file; + $filedata = ($isfile === true) ? $this->_file2str($file) : $file; + + if (PEAR::isError($filedata)) { + return $filedata; + } + if ($isfile === true) { // Force the name the user supplied, otherwise use $file $filename = (strlen($name)) ? $name : $file; @@ -355,9 +359,6 @@ class Mail_mime return $err; } $filename = $this->_basename($filename); - if (PEAR::isError($filedata)) { - return $filedata; - } $this->_parts[] = array( 'body' => $filedata, @@ -368,8 +369,8 @@ class Mail_mime 'language' => $language, 'location' => $location, 'disposition' => $disposition, - 'name-encoding' => $n_encoding, - 'filename-encoding'=> $f_encoding + 'name-encoding' => $n_encoding, + 'filename-encoding' => $f_encoding ); return true; } @@ -397,16 +398,16 @@ class Mail_mime $err = PEAR::raiseError('File is not readable: ' . $file_name); return $err; } - + //Temporarily reset magic_quotes_runtime and read file contents if ($magic_quote_setting = get_magic_quotes_runtime()) { set_magic_quotes_runtime(0); } - $cont = file_get_contents($file_name); + $cont = file_get_contents($file_name); if ($magic_quote_setting) { set_magic_quotes_runtime($magic_quote_setting); } - + return $cont; } @@ -471,7 +472,7 @@ class Mail_mime { $params = array(); $params['content_type'] = 'multipart/mixed'; - + //Create empty multipart/mixed Mail_mimePart object to return $ret = new Mail_mimePart('', $params); return $ret; @@ -538,16 +539,17 @@ class Mail_mime $params['disposition'] = 'inline'; $params['dfilename'] = $value['name']; $params['cid'] = $value['cid']; - if ($value['name-encoding']) { - $params['name-encoding'] = $value['name-encoding']; - } - if ($value['filename-encoding']) { - $params['filename-encoding'] = $value['filename-encoding']; - } - + + if (!empty($value['name-encoding'])) { + $params['name-encoding'] = $value['name-encoding']; + } + if (!empty($value['filename-encoding'])) { + $params['filename-encoding'] = $value['filename-encoding']; + } + $ret = $obj->addSubpart($value['body'], $params); return $ret; - + } /** @@ -573,12 +575,12 @@ class Mail_mime if ($value['location']) { $params['location'] = $value['location']; } - if ($value['name-encoding']) { - $params['name-encoding'] = $value['name-encoding']; - } - if ($value['filename-encoding']) { - $params['filename-encoding'] = $value['filename-encoding']; - } + if ($value['name-encoding']) { + $params['name-encoding'] = $value['name-encoding']; + } + if ($value['filename-encoding']) { + $params['filename-encoding'] = $value['filename-encoding']; + } $params['content_type'] = $value['c_type']; $params['disposition'] = isset($value['disposition']) ? $value['disposition'] : 'attachment'; @@ -605,9 +607,9 @@ class Mail_mime * @access public */ function getMessage( - $separation = null, - $build_params = null, - $xtra_headers = null, + $separation = null, + $build_params = null, + $xtra_headers = null, $overwrite = false ) { @@ -658,7 +660,7 @@ class Mail_mime $this->_build_params[$key] = $value; } } - + if (isset($this->_headers['From'])){ //Bug #11381: Illegal characters in domain ID if (preg_match("|(@[0-9a-zA-Z\-\.]+)|", $this->_headers['From'], $matches)){ @@ -670,7 +672,7 @@ class Mail_mime $this->_html_images[$i]['cid'] = $this->_html_images[$i]['cid'] . $domainID; } } - + if (count($this->_html_images) AND isset($this->_htmlbody)) { foreach ($this->_html_images as $key => $value) { $regex = array(); @@ -684,7 +686,7 @@ class Mail_mime $rep[] = 'url(\1cid:' . $value['cid'] . '\1)'; $this->_htmlbody = preg_replace($regex, $rep, $this->_htmlbody); - $this->_html_images[$key]['name'] = + $this->_html_images[$key]['name'] = $this->_basename($this->_html_images[$key]['name']); } } @@ -775,7 +777,7 @@ class Mail_mime if (isset($message)) { $output = $message->encode(); - + $this->_headers = array_merge($this->_headers, $output['headers']); $body = $output['body']; @@ -831,7 +833,7 @@ class Mail_mime function txtHeaders($xtra_headers = null, $overwrite = false) { $headers = $this->headers($xtra_headers, $overwrite); - + $ret = ''; foreach ($headers as $key => $val) { $ret .= "$key: $val" . MAIL_MIME_CRLF; @@ -943,11 +945,11 @@ class Mail_mime //$hdr_value_out: The recombined $hdr_val-atoms, or the encoded string. //Note: Atom as specified here is not exactly the same as an RFC822 atom, //as $atom's may contain just a single space. - - $useIconv = true; + + $useIconv = true; if (isset($build_params['ignore-iconv'])) { $useIconv = !$build_params['ignore-iconv']; - } + } foreach ($input as $hdr_name => $hdr_value) { /* $parts = preg_split('/([ ])/', $hdr_value, -1, PREG_SPLIT_DELIM_CAPTURE); @@ -977,14 +979,14 @@ class Mail_mime $imePrefs['output-charset'] = $build_params['head_charset']; $imePrefs['line-length'] = 74; $imePrefs['line-break-chars'] = "\r\n"; //Specified in RFC2047 - + $hdr_value = iconv_mime_encode($hdr_name, $hdr_value, $imePrefs); $hdr_value = preg_replace("#^{$hdr_name}\:\ #", "", $hdr_value); } elseif ($build_params['head_encoding'] == 'base64') { //Base64 encoding has been selected. //Base64 encode the entire string $hdr_value = base64_encode($hdr_value); - + //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 first -2 is there so @@ -1000,7 +1002,7 @@ class Mail_mime //we can get must be rounded down. $maxLength = $maxLength - ($maxLength % 4); $maxLength1stLine = $maxLength1stLine - ($maxLength1stLine % 4); - + $cutpoint = $maxLength1stLine; $hdr_value_out = $hdr_value; $output = ""; @@ -1009,10 +1011,10 @@ class Mail_mime $part = substr($hdr_value_out, 0, $cutpoint); $hdr_value_out = substr($hdr_value_out, $cutpoint); $cutpoint = $maxLength; - //RFC 2047 specifies that any split header should + //RFC 2047 specifies that any split header should //be seperated by a CRLF SPACE. if ($output) { - $output .= "\r\n "; + $output .= "\r\n "; } $output .= $prefix . $part . $suffix; } @@ -1036,7 +1038,7 @@ class Mail_mime $hdr_value = substr($hdr_value, 0, -1); $quoteSuffix = '"'; } - + //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 @@ -1048,12 +1050,12 @@ class Mail_mime $maxLength = 75 - strlen($prefix . $suffix) - 2 - 1; $maxLength1stLine = $maxLength - strlen($hdr_name) - 2; $maxLength = $maxLength - 1; - + //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', @@ -1067,7 +1069,7 @@ class Mail_mime //Fix for Bug #10298, Ota Mares <om@viazenetti.de> //Concat the double quotes and encoded string together $hdr_value = $quotePrefix . $hdr_value . $quoteSuffix; - + $hdr_value_out = $hdr_value; $realMax = $maxLength1stLine + strlen($prefix . $suffix); if (strlen($hdr_value_out) >= $realMax) { @@ -1078,11 +1080,11 @@ class Mail_mime //Split translated string at every $maxLength //But make sure not to break any translated chars. $found = preg_match($reg, $hdr_value_out, $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_out variable. @@ -1094,11 +1096,11 @@ class Mail_mime $part = $hdr_value_out; $hdr_value_out = ""; } - + //RFC 2047 specifies that any split header should //be seperated by a CRLF SPACE if ($output) { - $output .= "\r\n "; + $output .= "\r\n "; } $output .= $prefix . $part . $suffix; } @@ -1140,11 +1142,11 @@ class Mail_mime */ function _basename($filename) { - // basename() is not unicode safe and locale dependent - if (stristr(PHP_OS, 'win') || stristr(PHP_OS, 'netware')) - return preg_replace('/^.*[\\\\\\/]/', '', $filename); - else - return preg_replace('/^.*[\/]/', '', $filename); + // basename() is not unicode safe and locale dependent + if (stristr(PHP_OS, 'win') || stristr(PHP_OS, 'netware')) + return preg_replace('/^.*[\\\\\\/]/', '', $filename); + else + return preg_replace('/^.*[\/]/', '', $filename); } } // End of class diff --git a/program/lib/Mail/mimePart.php b/program/lib/Mail/mimePart.php index bf025dc8f..2ab146f29 100644 --- a/program/lib/Mail/mimePart.php +++ b/program/lib/Mail/mimePart.php @@ -182,19 +182,19 @@ class Mail_mimePart { } } - + if (isset($contentType['type'])) { $headers['Content-Type'] = $contentType['type']; - if (isset($contentType['charset'])) { + if (isset($contentType['charset'])) { $headers['Content-Type'] .= "; charset={$contentType['charset']}"; } if (isset($contentType['name'])) { $headers['Content-Type'] .= ';' . MAIL_MIMEPART_CRLF; $headers['Content-Type'] .= - $this->_buildHeaderParam('name', $contentType['name'], - isset($contentType['charset']) ? $contentType['charset'] : 'US-ASCII', + $this->_buildHeaderParam('name', $contentType['name'], + isset($contentType['charset']) ? $contentType['charset'] : 'US-ASCII', isset($contentType['language']) ? $contentType['language'] : NULL, - isset($params['name-encoding']) ? $params['name-encoding'] : NULL); + isset($params['name-encoding']) ? $params['name-encoding'] : NULL); } } @@ -204,10 +204,10 @@ class Mail_mimePart { if (isset($contentDisp['filename'])) { $headers['Content-Disposition'] .= ';' . MAIL_MIMEPART_CRLF; $headers['Content-Disposition'] .= - $this->_buildHeaderParam('filename', $contentDisp['filename'], - isset($contentDisp['charset']) ? $contentDisp['charset'] : 'US-ASCII', + $this->_buildHeaderParam('filename', $contentDisp['filename'], + isset($contentDisp['charset']) ? $contentDisp['charset'] : 'US-ASCII', isset($contentDisp['language']) ? $contentDisp['language'] : NULL, - isset($params['filename-encoding']) ? $params['filename-encoding'] : NULL); + isset($params['filename-encoding']) ? $params['filename-encoding'] : NULL); } } @@ -257,8 +257,8 @@ class Mail_mimePart { } $encoded['body'] = '--' . $boundary . MAIL_MIMEPART_CRLF . - implode('--' . $boundary . MAIL_MIMEPART_CRLF , $subparts) . - '--' . $boundary.'--' . MAIL_MIMEPART_CRLF; + implode('--' . $boundary . MAIL_MIMEPART_CRLF , $subparts) . + '--' . $boundary.'--' . MAIL_MIMEPART_CRLF; } else { $encoded['body'] = $this->_getEncodedData($this->_body, $this->_encoding); @@ -398,26 +398,28 @@ class Mail_mimePart { function _buildHeaderParam($name, $value, $charset=NULL, $language=NULL, $paramEnc=NULL, $maxLength=78) { // RFC 2045: - // value needs encoding if contains non-ASCII chars or is longer than 78 chars + // value needs encoding if contains non-ASCII chars or is longer than 78 chars if (!preg_match('#[^\x20-\x7E]#', $value)) { // ASCII - // token - if (!preg_match('#([^\x21,\x23-\x27,\x2A,\x2B,\x2D,\x2E,\x30-\x39,\x41-\x5A,\x5E-\x7E])#', $value)) { - if (strlen($name) + strlen($value) + 3 <= $maxLength) - return " {$name}={$value};"; - } else { // quoted-string - $quoted = addcslashes($value, '\\"'); - if (strlen($name) + strlen($quoted) + 5 <= $maxLength) - return " {$name}=\"{$quoted}\";"; - } - } - - // RFC2047: use quoted-printable/base64 encoding - if ($paramEnc == 'quoted-printable' || $paramEnc == 'base64') - return $this->_buildRFC2047Param($name, $value, $charset, $paramEnc); - - // RFC2231: - $encValue = preg_replace('#([^\x21,\x23,\x24,\x26,\x2B,\x2D,\x2E,\x30-\x39,\x41-\x5A,\x5E-\x7E])#e', - '"%" . strtoupper(dechex(ord("\1")))', $value); + // token + if (!preg_match('#([^\x21,\x23-\x27,\x2A,\x2B,\x2D,\x2E,\x30-\x39,\x41-\x5A,\x5E-\x7E])#', $value)) { + if (strlen($name) + strlen($value) + 3 <= $maxLength) + return " {$name}={$value};"; + } else { // quoted-string + $quoted = addcslashes($value, '\\"'); + if (strlen($name) + strlen($quoted) + 5 <= $maxLength) + return " {$name}=\"{$quoted}\";"; + } + } + + // RFC2047: use quoted-printable/base64 encoding + if ($paramEnc == 'quoted-printable' || $paramEnc == 'base64') + return $this->_buildRFC2047Param($name, $value, $charset, $paramEnc); + + // RFC2231: + $encValue = preg_replace( + '#([^\x21,\x23,\x24,\x26,\x2B,\x2D,\x2E,\x30-\x39,\x41-\x5A,\x5E-\x7E])#e', + '"%" . strtoupper(dechex(ord("\1")))', + $value); $value = "$charset'$language'$encValue"; $header = " {$name}*={$value};"; @@ -461,64 +463,64 @@ class Mail_mimePart { */ function _buildRFC2047Param($name, $value, $charset, $encoding='quoted-printable', $maxLength=75) { - // WARNING: RFC 2047 says: "An 'encoded-word' MUST NOT be used in - // parameter of a MIME Content-Type or Content-Disposition field" - // but... it's supported by many clients/servers - - if ($encoding == 'base64') - { - $value = base64_encode($value); + // WARNING: RFC 2047 says: "An 'encoded-word' MUST NOT be used in + // parameter of a MIME Content-Type or Content-Disposition field" + // but... it's supported by many clients/servers + + if ($encoding == 'base64') + { + $value = base64_encode($value); $prefix = '=?' . $charset . '?B?'; $suffix = '?='; - $quoted = ''; + $quoted = ''; - $add_len = strlen($prefix . $suffix) + strlen($name) + 6; // 2 x SPACE, 2 x '"', '=', ';' - $len = $add_len + strlen($value); + $add_len = strlen($prefix . $suffix) + strlen($name) + 6; // 2 x SPACE, 2 x '"', '=', ';' + $len = $add_len + strlen($value); - while ($len > $maxLength) { - // We can cut base64-encoded string every 4 characters - $real_len = floor(($maxLength - $add_len) / 4) * 4; - $_quote = substr($value, 0, $real_len); - $value = substr($value, $real_len); + while ($len > $maxLength) { + // We can cut base64-encoded string every 4 characters + $real_len = floor(($maxLength - $add_len) / 4) * 4; + $_quote = substr($value, 0, $real_len); + $value = substr($value, $real_len); - $quoted .= $prefix . $_quote . $suffix . MAIL_MIMEPART_CRLF . ' '; - $add_len = strlen($prefix . $suffix) + 4; // 2 x SPACE, '"', ';' - $len = strlen($value) + $add_len; - } + $quoted .= $prefix . $_quote . $suffix . MAIL_MIMEPART_CRLF . ' '; + $add_len = strlen($prefix . $suffix) + 4; // 2 x SPACE, '"', ';' + $len = strlen($value) + $add_len; + } $quoted .= $prefix . $value . $suffix; } - else // quoted-printable - { - // Replace all special characters used by the encoder. + else // quoted-printable + { + // Replace all special characters used by the encoder. $search = array('=', '_', '?', ' '); - $replace = array('=3D', '=5F', '=3F', '_'); - $value = str_replace($search, $replace, $value); + $replace = array('=3D', '=5F', '=3F', '_'); + $value = str_replace($search, $replace, $value); - // Replace all extended characters (\x80-xFF) with their - // ASCII values. - $value = preg_replace('/([\x80-\xFF])/e', - '"=" . strtoupper(dechex(ord("\1")))', $value); + // Replace all extended characters (\x80-xFF) with their + // ASCII values. + $value = preg_replace('/([\x80-\xFF])/e', + '"=" . strtoupper(dechex(ord("\1")))', $value); $prefix = '=?' . $charset . '?Q?'; $suffix = '?='; - $add_len = strlen($prefix . $suffix) + strlen($name) + 6; // 2 x SPACE, 2 x '"', '=', ';' - $len = $add_len + strlen($value); - - while ($len > $maxLength) { - $length = $maxLength - $add_len; - // not break any encoded letters - if(preg_match("/^(.{0,$length}[^\=][^\=])/", $value, $matches)) - $_quote = $matches[1]; - - $quoted .= $prefix . $_quote . $suffix . MAIL_MIMEPART_CRLF . ' '; - $value = substr($value, strlen($_quote)); - $add_len = strlen($prefix . $suffix) + 4; // 2 x SPACE, '"', ';' - $len = strlen($value) + $add_len; - } - - $quoted .= $prefix . $value . $suffix; + $add_len = strlen($prefix . $suffix) + strlen($name) + 6; // 2 x SPACE, 2 x '"', '=', ';' + $len = $add_len + strlen($value); + + while ($len > $maxLength) { + $length = $maxLength - $add_len; + // not break any encoded letters + if(preg_match("/^(.{0,$length}[^\=][^\=])/", $value, $matches)) + $_quote = $matches[1]; + + $quoted .= $prefix . $_quote . $suffix . MAIL_MIMEPART_CRLF . ' '; + $value = substr($value, strlen($_quote)); + $add_len = strlen($prefix . $suffix) + 4; // 2 x SPACE, '"', ';' + $len = strlen($value) + $add_len; + } + + $quoted .= $prefix . $value . $suffix; } return " {$name}=\"{$quoted}\"; "; |