今日の驚き!

Computer 11月 9, 2006 #PHP
(Last Updated On: )

何故かmb_send_mailでメールが文字化けする、普通に運用しているサーバでは問題が無いにも関わらず…

調べてみるとmbstring.languageのaccess設定が6になっていました。6つまりスクリプトからは変更できない状態になっています。運用サーバ環境(開発環境含む)ではphp.ini設定はほとんど全て仮想サーバレベルで設定していたので今まで気が付きませんでした。

mbstring.languageの設定が変更できないと、mb_send_mail()を使って正しくメールを送信することができなくなります。(日本だけ、とかなら良いですが)この件、かなり「怒」なので時間ができたら誰が変更したか調べる事にします。

PHPは5.1…

追記:
mb_send_mail()で文字化けで困っている方は、php.iniなら

mbstring.language = “japanese”

Apacheの設定ファイル、.htaccessなどなら

php_value mbstring.languge japanese

と設定します。これで日本語メールでも文字化けしなくなります。デフォルトのmbstring.language設定(neutral)の場合、日本語メールは正しく送信できません。

パッチをするなら(PHP_5_2ブランチ)

cvs diff: Diffing ext/mbstring
Index: ext/mbstring/mbstring.c
===================================================================
RCS file: /repository/php-src/ext/mbstring/mbstring.c,v
retrieving revision 1.224.2.23
diff -u -r1.224.2.23 mbstring.c
— ext/mbstring/mbstring.c 11 May 2006 14:47:34 -0000 1.224.2.23
+++ ext/mbstring/mbstring.c 10 Nov 2006 05:10:51 -0000
@@ -739,7 +739,7 @@

/* {{{ php.ini directive registration */
PHP_INI_BEGIN()
– PHP_INI_ENTRY(“mbstring.language”, “neutral”, PHP_INI_SYSTEM | PHP_INI_PERDIR, OnUpdate_mbstring_language)
+ PHP_INI_ENTRY(“mbstring.language”, “neutral”, PHP_INI_ALL, OnUpdate_mbstring_language)
PHP_INI_ENTRY(“mbstring.detect_order”, NULL, PHP_INI_ALL, OnUpdate_mbstring_detect_order)
PHP_INI_ENTRY(“mbstring.http_input”, “pass”, PHP_INI_ALL, OnUpdate_mbstring_http_input)
PHP_INI_ENTRY(“mbstring.http_output”, “pass”, PHP_INI_ALL, OnUpdate_mbstring_http_output)

1行パッチなので他のバージョンでも同じ場所を直せばOKです。パッチをすればmb_language()で言語設定を変更しmb_send_mail()で正しくメールが送信できるようになります。

投稿者: yohgaki