[PHP-users 27636] Re: mb_send_mailにて

遠藤 俊裕 endo_t @ nifty.com
2005年 11月 27日 (日) 15:57:07 JST


遠藤です。

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

Sun, 27 Nov 2005 07:41:17 +0900 に、
遠藤 俊裕 <endo_t @ nifty.com> さんは書きました:

> とりあえず、4.4.11 にしてみました。
> 上記ワーニングは出ないようです。
> base64 はそのままです。

プログラム的に、昔の方法で以下のようにしてました。

1. スクリプトファイルは S-JIS で書かれている(Win から作業するため)
2. 題名に漢字が入っていたら(preg_match("/[\x80-\xA0]/", $Subject))
  "=?iso-2022-jp?B?" . base64_encode( $Subject ). "?=" を行う
3. mb_convert_encoding で本文、ヘッダ等を JIS にする
4. これを mb_send_mail に渡す

これをしたところ、becky! で受け取った題名は Base64 でした。
不思議なので /var/mail の中身をそのまま見たら、なんと、Base64 を
Base64 した物が入ってました。

そこで、「漢字が入っていたら base64 変換を行う」部分を外してみま
した。すると、受信したメールの途中まではうまく漢字なのですが、そ
の後は化けてます(これは /var/mail 見てません)

なんとなく納得いかなかったんですが、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");
# して試しても見ましたが、効果ありませんでした。

しかし、4.3.7 では動作していたコードが根本的に動かなくなるのは
如何なものかと。それも、なんで base64 したものを base64 するの
かなぁ?意味分からん。。。。たぶん、理解不足なんだと思います。

この辺おわかりの方、お教え頂けませんでしょうか?
とりあえず解決したので、運用には入れるのですが気持ち悪いです(>_<)

-- 
遠藤俊裕 <endo_t @ nifty.com>



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