Make quoted_printable_encode() work on PHP4
I'm try开发者_运维问答ing to use the quoted_printable_encode() and [quoted_prinatble_decode(), but the problem is my server is running PHP4, and according to the PHP docs, quoted_printable_encode() is only available on PHP 5 >= 5.3.0. Does anyone know of a hack or workaround so I could utilize the encode func
According to the docs you could use imap_8bit, however you should really consider upgrading to php5. It's been around for over 6 years!
I can't thank you all enough for the support and help. I totally agree we should upgrade to PHP5 - but this is for the large corporation I work for, and as many of you know, there are certain things that SHOULD happen, but don't or can't. I'm just an intern, anyways, so I'm going to do as they say =)
I figured it out -
function quoted_printable_encode($input, $line_max = 75) { // Quoted_printable_encode that works with php 4.x
$hex = array('0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F');
$lines = preg_split("/(?:\r\n|\r|\n)/", $input);
$linebreak = "=0D=0A=\r\n";
/* the linebreak also counts as characters in the mime_qp_long_line
* rule of spam-assassin */
$line_max = $line_max - strlen($linebreak);
$escape = "=";
$output = "";
$cur_conv_line = "";
$length = 0;
$whitespace_pos = 0;
$addtl_chars = 0;
// iterate lines
for ($j=0; $j<count($lines); $j++) {
$line = $lines[$j];
$linlen = strlen($line);
// iterate chars
for ($i = 0; $i < $linlen; $i++) {
$c = substr($line, $i, 1);
$dec = ord($c);
$length++;
if ($dec == 32) {
// space occurring at end of line, need to encode
if (($i == ($linlen - 1))) {
$c = "=20";
$length += 2;
}
$addtl_chars = 0;
$whitespace_pos = $i;
} elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) {
$h2 = floor($dec/16); $h1 = floor($dec%16);
$c = $escape . $hex["$h2"] . $hex["$h1"];
$length += 2;
$addtl_chars += 2;
}
// length for wordwrap exceeded, get a newline into the text
if ($length >= $line_max) {
$cur_conv_line .= $c;
// read only up to the whitespace for the current line
$whitesp_diff = $i - $whitespace_pos + $addtl_chars;
/* the text after the whitespace will have to be read
* again ( + any additional characters that came into
* existence as a result of the encoding process after the whitespace)
*
* Also, do not start at 0, if there was *no* whitespace in
* the whole line */
if (($i + $addtl_chars) > $whitesp_diff) {
$output .= substr($cur_conv_line, 0, (strlen($cur_conv_line) -
$whitesp_diff)) . $linebreak;
$i = $i - $whitesp_diff + $addtl_chars;
} else {
$output .= $cur_conv_line . $linebreak;
}
$cur_conv_line = "";
$length = 0;
$whitespace_pos = 0;
} else {
// length for wordwrap not reached, continue reading
$cur_conv_line .= $c;
}
} // end of for
$length = 0;
$whitespace_pos = 0;
$output .= $cur_conv_line;
$cur_conv_line = "";
if ($j<=count($lines)-1) {
$output .= $linebreak;
}
} // end for
return trim($output);
} // end quoted_printable_encode
Makes it work. I happened to check back here after you all posted, so unfortunately I have not tested your solutions, but the function above works just perfectly!
Thank you all again!
Do you have the IMAP module installed? What about using imap_8bit()
instead?
The best thing to do would be upgrade to PHP 5. 4 is dead.
If that is really, really not an option, the manual page you link to has a few alternatives (imap_8bit()
and some alternative implementations in the user contributed notes).
public function quoted_printable($mesg){
$orders = unpack("C*", $mesg);
unset($mesg);
array_filter($orders, array($this, 'cb_qp'));
return implode($orders);
}
// Quoted-Printable Callback
private function cb_qp(&$byte){
$byte = ($byte > 126 || $byte == 61 || $byte == 37) ? sprintf('=%X', $byte) : pack("C", $byte);
}
// http://rolfrost.de/proglog.html?d=20130324
精彩评论