(ページの作成: == SwiftMailerをiso-2022-jp対応にする == * ちょっと古いのですが、SwiftMailer(バージョン3系)を使うことになりました。 * すべてutf-8でい...) |
Dondariadmin (トーク | 投稿記録) |
||
(他の1人の利用者による、間の1版が非表示) | |||
1行目: | 1行目: | ||
− | + | = SwiftMailerをiso-2022-jp対応にする = | |
* ちょっと古いのですが、SwiftMailer(バージョン3系)を使うことになりました。 | * ちょっと古いのですが、SwiftMailer(バージョン3系)を使うことになりました。 | ||
6行目: | 6行目: | ||
* 最近のメール事情を思うと、utf-8エンコードでも大丈夫そうな気はしますが、やっぱり日本のスタンダードであるiso-2022-jpに対応しておくべきと思われますので、修正しました。 | * 最近のメール事情を思うと、utf-8エンコードでも大丈夫そうな気はしますが、やっぱり日本のスタンダードであるiso-2022-jpに対応しておくべきと思われますので、修正しました。 | ||
− | + | == 修正その1 本文部分のエンコード == | |
* Charsetの設定自体は可能なので、本文部分はextendsして、エンコードするようにしました。 | * Charsetの設定自体は可能なので、本文部分はextendsして、エンコードするようにしました。 | ||
17行目: | 17行目: | ||
} | } | ||
− | + | == 修正その2 ヘッダ部分のエンコード == | |
* 特に目立ってしまうのがメールヘッダの Subject: だと思います。 | * 特に目立ってしまうのがメールヘッダの Subject: だと思います。 | ||
* これも修正その1と同じようにextendsしてオーバーライドすべきと思ったのですが、インスタンス化している箇所が深いところにあるので、仕方なくSwift_Message_Headersを修正しました。 | * これも修正その1と同じようにextendsしてオーバーライドすべきと思ったのですが、インスタンス化している箇所が深いところにあるので、仕方なくSwift_Message_Headersを修正しました。 | ||
88行目: | 88行目: | ||
* JISコードのシフトイン・シフトアウトコード(?)あたりの問題だと思うのですが、この違いにより、サブジェクトの後半が文字化けしてしまいます。(受信するメールソフト/メールアプリによっては補正してくれる場合もありますが、そこは頼るところではないでしょう) | * JISコードのシフトイン・シフトアウトコード(?)あたりの問題だと思うのですが、この違いにより、サブジェクトの後半が文字化けしてしまいます。(受信するメールソフト/メールアプリによっては補正してくれる場合もありますが、そこは頼るところではないでしょう) | ||
+ | |||
+ | [[Category:PHP]] | ||
+ | [[Category:SwiftMailer]] |
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==?=