※ このプラグインのアップデートはこちらに移動しました。
WordPress を使っていてたびたび直面するメールの文字化けを、プラグイン一発で解決したいと思った次第です。
コメントやトラックバックをもらった時や、コンタクトフォームからメッセージを送ってもらった時なんかに、管理者あてに通知メールが飛ぶようになっているんですが、これの件名や送信者が文字化けして読めないケースがままあります。
WordPress はこういうメールを飛ばすときに、PHP 標準の mail() をラップした wp_mail() という関数を使います。一般に、Subject: や From: のヘッダに日本語の文字が含まれる場合にはこれらを Base64 なりでエンコードしておく必要がありますが、wp_mail() では特にそういう処理はしていなくて、問題の原因はそこにありそうです。
wp_mail() を定義しているところを書き換えて、必要な処理を加えてやればいいわけですが、コアのコードに手を入れるのは余りうれしくなかったりもします。できればプラグインでやりたい。
ありがたいことに、wp_mail() は pluggable です。つまりこんな具合に定義されているので:
if ( !function_exists('wp_mail') ) :
function wp_mail($to, $subject, $message, $headers = '') {
if( $headers == '' ) {
$headers = "MIME-Version: 1.0\n" .
"From: wordpress@" . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME'])) . "\n" .
"Content-Type: text/plain; charset=\"" . get_settings('blog_charset') . "\"\n";
}
return @mail($to, $subject, $message, $headers);
}
endif;
この時点で既に wp_mail() が定義済みであれば、先に行なわれた定義が優先されます。プラグインの処理はこれより先に行われるので、単純にプラグインの中で wp_mail() を定義してやればそれが有効になるというわけです。うーん、希望通り。
というわけでプラグイン作りました。名前は、日本語環境の諸問題を一手に解決するぞ、という意気込みを込めて、nippon.php。ちょっと大仰だけどね。
たんじゅんにプラグインのディレクトリに置いて有効化すれば OK です。
問題の中身ですが、現在はこのように、UTF-8 でも EUC-JP でも、一応なんでもそれなりの対処はできるように書いています:
if ( !function_exists('wp_mail') ) :
function wp_mail($to, $subject, $message, $headers = '') {
if( $headers == '' ) {
$headers = "MIME-Version: 1.0\n" .
"From: wordpress@" . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME'])) . "\n" .
"Content-Type: text/plain; charset=\"" . get_settings('blog_charset') . "\"\n";
}
switch (get_settings('blog_charset')) {
case 'UTF-8':
if (function_exists('mb_encode_mimeheader')) {
mb_language('uni');
mb_internal_encoding('UTF-8');
$subject = mb_encode_mimeheader($subject);
$headers_before = explode("\n", $headers);
foreach ($headers_before as $header) {
if (preg_match("/^From:\s(.*)$/", $header, $regs)) {
$header = "From: " . mb_encode_mimeheader($regs[1]);
}
$headers_after[] = $header;
}
$headers = implode("\n", $headers_after);
}
return @mail($to, $subject, $message, $headers);
case 'EUC-JP':
case 'Shift_JIS':
case 'ISO-2022-JP':
if (function_exists('mb_send_mail')) {
mb_language('Japanese');
mb_internal_encoding('EUC-JP');
return @mb_send_mail($to, $subject, $message, $headers);
} else {
return @mail($to, $subject, $message, $headers);
}
default:
return @mail($to, $subject, $message, $headers);
}
}
endif;
自分が試せる範囲ではこれでうまく機能するんですが、もっといろんな環境で使って試してみないとまだまだわからないですね。
というわけなので、もしこれ使ってくれる方がいたら、これでメールの文字化けが解決したか解決しなかったか、サーバ環境の情報を添えて報告いただけると、今後改良していくうえで非常に役立ちます。期待通り文字化けが解決した場合も、そのときのサーバ情報が蓄積できるとデータとしてうれしいので、ぜひお願いします。
よろしくお願いします。
はじめましてこんにちは
このプラグイン早速使わせていただきました。
・バージョン WP 2.0.4
・サーバー さくら
・文字コード UTF-8
・文字化け 解決しました
こういう感じのご報告でよかったでしょうか?
自分でコメントテストしてちゃんと日本語表示されるのを確認しました!
以前からちょっと気になっていたので大変助かりました。
どうもありがとうございます!
lomo さん、早速報告ありがとうございます!
> ・バージョン WP 2.0.4
> ・サーバー さくら
> ・文字コード UTF-8
> ・文字化け 解決しました
ええ、そういうデータが欲しいのです。とても助かります
[...] 日本語パッケージ wpcf-ja.tar.gz http://www.miyoshitakayuki.com/wp-content/uploads/wpcf-ja.tar.gz Nippon http://www.miyoshitakayuki.com/archives/354 [...]