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