class my_SwiftMessage extends Swift_Message { public function setBody($body) { $body = mb_convert_encoding($body, $this->getCharset(), mb_detect_encoding($body)); parent::setBody($body); } }
getEncodedメソッドの修正箇所
elseif ($this->encoding == "B") //Need to Base64 encode { //元ソース部分をコメントアウト //See the comments in the elseif() above since the logic is the same (refactor?) //$spec = "=?" . $this->getCharset() . "?B?"; //$end = "?="; //$used_length = strlen($name) + 2 + strlen($spec) + 2; //$encoded_value[$key] = Swift_Message_Encoder::instance()->base64Encode( // $row, (75-(strlen($spec)+5)), ($key > 0 ? 0 : (76-($used_length+3))), true, $this->LE); //置換部分 mb_internal_encoding()が汚い // mb_encode_mimeheaderでencode $internal_encoding_save = mb_internal_encoding(); mb_internal_encoding(mb_detect_encoding($row)); $encoded_value[$key] = mb_encode_mimeheader($row, $this->getCharset(), 'B', $this->LE); mb_internal_encoding($internal_encoding_save); }
<?php $subject_utf = 'サブジェクト'; // ソースはutf-8で記述 mb_internal_encoding('utf-8'); // 先にJISにエンコード変換してencode_mimeheader $subject_jis = mb_convert_encoding($subject_utf, 'iso-2022-jp', 'utf-8'); echo mb_encode_mimeheader($subject_jis, 'iso-2022-jp') . PHP_EOL; // utf8のままencode_mimeheader (encode_mimeheaderに変換を任せる) echo mb_encode_mimeheader($subject_utf, 'iso-2022-jp') . PHP_EOL;
=?ISO-2022-JP?B?GyRCJTUlViU4JSclLyVIGyhC?= =?ISO-2022-JP?B?GyRCJTUlViU4JSclLyVIGyhC?=
<?php $subject_utf = '長いサブジェクトの場合は結果が異なります';
=?ISO-2022-JP?B?GyRCRDkkJCU1JVYlOCUnJS8lSCROPmw5ZyRPN2syTCQsMFskSiRqJF4k?= =?ISO-2022-JP?B?ORsoQg==?= =?ISO-2022-JP?B?GyRCRDkkJCU1JVYlOCUnJS8lSCROPmw5ZyRPN2syTCQsMFskSiRqGyhC?= =?ISO-2022-JP?B?GyRCJF4kORsoQg==?=