[PHP-users 27639] Re: mb_send_mailにて

komura komura @ ma9.seikyou.ne.jp
2005年 11月 27日 (日) 18:09:22 JST


komura です。

On Sun, 27 Nov 2005 15:57:07 +0900
遠藤 俊裕 <endo_t @ nifty.com> wrote:

> 遠藤です。
> 
> 自己フォローです。
> 以下は全て 4.4.11 での話です。m(_ _)m
> # 5.0.5 はご退場願いました(~_~)

PHP のバージョンは PHP 4.3.11 でしょうか、それとも PHP 4.4.1 で
しょうか?
どちらのバージョンも以下で報告されているバグの影響で文字化けする
可能性がありますので注意してください。

PHP 4.3.11 では mb_convert_encoding() にバグがあるため、文字コード
変換が失敗する可能性があります。

  http://ns1.php.gr.jp/pipermail/php-users/2005-April/025814.html

PHP 4.4.1 では  mb_encode_mimeheader() のバグがあり、mb_send_mail() 
でもその影響を受けるため、文字化けすることがあります。

  http://ns1.php.gr.jp/pipermail/php-users/2005-July/026701.html

この辺りのバグが気になるのであれば、PHP 4.4.2RC1 を試してみると
良いと思います。


> なんとなく納得いかなかったんですが、Subject を JIS に mb_convert_encoding
> せずに、EUC-JP に変換したらうまく行きました。
> 
> 具体的には
> $Subject = mb_convert_encoding($Subject, "EUC-JP", "auto");
> mb_send_mail($mailto, $Subject, $body, $headder );
> です。
> 
> 良く分かってないんですが、mb_internal_encoding が EUC-JP なら
> JIS で渡そうが、S-JIS で渡そうが、UTF-8 で渡そうが内部処理と
> して EUC-JP にしてから処理するんじゃないんでしょうか?
> この辺の思い違いが大きいと思ってます。
> # ちなみに、php.ini では内部コードは EUC-JP ですし、mb_send_mail
> # の直前で mb_language("ja"); mb_internal_encoding("EUC-JP");
> # して試しても見ましたが、効果ありませんでした。

mb_send_mail() などの多くのマルチバイト文字列関数は受け取った引数
の文字コードが内部エンコードと同じであることを期待しています。

このため、内部コードに EUC-JP を指定しているのであれば、mb_send_mail()
の日本語を扱う引数の文字コードは全て EUC-JP に変換して渡す必要があり
ます。

mb_send_mail() の内部処理としては、mbstring.language または、
mb_language() で指定された言語に従って Subject の MIME エンコード、
body のエンコード変換を行い、必要なメールヘッダを付加して mail() に
渡しています。


PHP 4.3.7 と PHP 4.4.1 では、MIME エンコードを行う際に、? や = など
が含まれていても MIME エンコードを行うようになったという違いがあり
ますので、二重に base64 エンコーディングされてしまっているのはこの
影響かもしれません。

-- 
komura <komura @ ma9.seikyou.ne.jp>


PHP-users メーリングリストの案内