昨日の記事でWordPress2.2.3のコメント通知メールはしっかりUTF-8で送ってくるが、しばらく放置する、と書いた。ググってみるとWordPressのコメント通知メールが文字化けする、という話もちらちら出るが、どうも勘違いしている人がいるようだ。
- WordPress 2.2以降ではME版も本家版も、ブログの文字コードと同じ文字コードでコメント通知メールを送るようになっている。日本語のブログの場合はUTF-8でやることになるので、コメント通知メールもUTF-8で送ってくる。このメールはちゃんとContent-Transfer-Encoding: 8bit、Content-Type: text/plain; charset=”UTF-8″で送ってくるので、MIME的には正しいメールであり、この状態が「文字化けしている」のは、単に受け側が単にUTF-8なメールを読める環境にないだけの話。
- ただしSubjectが長くなると文字化けするバグはあるらしい。その場合本家2.2ならば文字化け実証プラグインを入れると直る。(Nippon2とかでも良いかもしれない。)
- とはいうものの、携帯なんかで見てる場合はUTF-8は辛い。やっぱりISO-2022-JPで送ってきてほしい。
というわけで、本家2.2.3でも前回やった無理矢理ISO-2022-JPにするパッチを施せばいいだろう、とゴソゴソやるがうまくいかない!
いろいろ調べてみると、前回の記事だけの修正では不十分であることがわかった。いろいろいじくった挙句だったので、class-phpmailer.phpなんかもいじったのが抜けていたようだ。
というわけで、次のようなコードでコメント通知メールが無事ISO-2022-JPで来るようになった。多分ME版でも同じような修正でいけるかな、と思うがよくわからない。ともかく手抜きであることは確かだが、自分にはこれで用が足りるので良しとする。
--- pluggable.php.bak 2007-08-31 03:13:48.000000000 +0900
+++ pluggable.php 2007-09-17 12:01:37.000000000 +0900
@@ -160,6 +160,8 @@
function wp_mail($to, $subject, $message, $headers = '') {
global $phpmailer;
+ mb_internal_encoding("UTF-8");
+
if ( !is_object( $phpmailer ) ) {
require_once(ABSPATH . WPINC . '/class-phpmailer.php');
require_once(ABSPATH . WPINC . '/class-smtp.php');
@@ -185,8 +187,10 @@
$phpmailer->FromName = "WordPress";
$phpmailer->AddAddress("$to", "");
- $phpmailer->Subject = $subject;
- $phpmailer->Body = $message;
+ $phpmailer->CharSet = "ISO-2022-JP";
+ $phpmailer->Encoding = "7bit";
+ $phpmailer->Subject = mb_encode_mimeheader($subject, "ISO-2022-JP", "B", "\n");
+ $phpmailer->Body = mb_convert_encoding($message, "ISO-2022-JP", "UTF-8");
$phpmailer->IsHTML(false);
$phpmailer->IsMail(); // set mailer to use php mail()
2007/9/22追記:トラックバックを頂いたMOMENTSさんの記事のパッチはFrom:の文字化けまで対応しているので、そちらの方が良いコードだと思います。
2007/10/6追記:WordPress 2.3なら、こっちのプラグインもお試しください。