pearのMail_mimeが気に食わなかった

マルチバイトを扱うのが面倒で、継承したクラスを作って・・・と思ったのですが、それもうまくいかず、結局直接書き換えました。

Index: Mail_mime_ja.class.php
===================================================================
--- Mail_mime_ja.class.php      (リビジョン 1307)
+++ Mail_mime_ja.class.php      (リビジョン 1309)
@@ -56,7 +56,7 @@
  * @package  Mail
  * @access   public
  */
-class Mail_mime
+class Mail_mime_ja
 {
     /**
      * Contains the plain text part of the email
@@ -110,16 +110,16 @@
      *
      * @access public
      */
-    function Mail_mime($crlf = "\r\n")
+    function Mail_mime_ja($crlf = "\r\n")
     {
         $this->_setEOL($crlf);
         $this->_build_params = array(
                                      'text_encoding' => '7bit',
                                      'html_encoding' => 'quoted-printable',
                                      '7bit_wrap'     => 998,
-                                     'html_charset'  => 'ISO-8859-1',
-                                     'text_charset'  => 'ISO-8859-1',
-                                     'head_charset'  => 'ISO-8859-1'
+                                     'html_charset'  => 'ISO-2022-JP',
+                                     'text_charset'  => 'ISO-2022-JP',
+                                     'head_charset'  => 'ISO-2022-JP'
                                     );
     }

@@ -162,6 +162,9 @@
             if (PEAR::isError($cont)) {
                 return $cont;
             }
+
+            $cont = mb_convert_encoding( $cont, mb_internal_encoding(), "auto" );
+
             if (!$append) {
                 $this->_txtbody = $cont;
             } else {
@@ -190,6 +193,9 @@
             if (PEAR::isError($cont)) {
                 return $cont;
             }
+
+            $cont = mb_convert_encoding( $cont, mb_internal_encoding(), "auto" );
+
             $this->_htmlbody = $cont;
         }

@@ -315,9 +321,9 @@
         $params['encoding']     = $this->_build_params['text_encoding'];
         $params['charset']      = $this->_build_params['text_charset'];
         if (is_object($obj)) {
-            return $obj->addSubpart($text, $params);
+            return $obj->addSubpart( mb_convert_encoding( $text, $this->_build_params['text_charset'] ), $params);
         } else {
-            return new Mail_mimePart($text, $params);
+            return new Mail_mimePart( mb_convert_encoding( $text, $this->_build_params['text_charset'] ), $params);
         }
     }

@@ -336,9 +342,9 @@
         $params['encoding']     = $this->_build_params['html_encoding'];
         $params['charset']      = $this->_build_params['html_charset'];
         if (is_object($obj)) {
-            return $obj->addSubpart($this->_htmlbody, $params);
+            return $obj->addSubpart( mb_convert_encoding( $this->_htmlbody, $this->_build_params['html_charset'] ), $params);
         } else {
-            return new Mail_mimePart($this->_htmlbody, $params);
+            return new Mail_mimePart( mb_convert_encoding( $this->_htmlbody, $this->_build_params['html_charset'] ), $params);
         }
     }

@@ -429,7 +435,7 @@
         $params['content_type'] = $value['c_type'];
         $params['encoding']     = $value['encoding'];
         $params['disposition']  = 'attachment';
-        $params['dfilename']    = $value['name'];
+        $params['dfilename']    = mb_convert_encoding( $value['name'], $this->_build_params['head_charset'] );
         $obj->addSubpart($value['body'], $params);
     }

@@ -676,6 +682,7 @@
     function _encodeHeaders($input)
     {
         foreach ($input as $hdr_name => $hdr_value) {
+            $hdr_value = mb_convert_encoding( $hdr_value, $this->_build_params['head_charset'] );
             preg_match_all('/(\w*[\x80-\xFF]+\w*)/', $hdr_value, $matches);
             foreach ($matches[1] as $value) {
                 $replacement = preg_replace('/([\x80-\xFF])/e',

しっかり検証してませんが、これだとパラメータをぎりぎりまで内部エンコードで扱うことができているはず!・・・です