开发者

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜