- ベストアンサー
mail()の文字化けについて
HPでPHP3のmail()を使って利用者にmailを出しているのですが、 かなりの頻度で文字化けしてしまっています。 コンピュータ同士の相性の問題なのでしょうか? それともプログラムに不備(あるいはこうすれば解消する) があるのでしょうか。 是非是非とも御教授のほどお願いいたします。 OSはUNIX(Irixv6.5.1)でwebサーバはAppach、phpは4でなく3(そのためnkfでエンコードしてます)、文字コードはEUCでUPしています。 $to="(formで入力された利用者のアドレス)"; $subject="(固定)"; $body="(formで利用者が入力されたものあり)"; $header="Content-Type: Text/Plain;charset=iso-2022-jp\nFrom: office@○○○×××.com\n"; $pp=popen("echo '$subject' | /usr/local/bin/nkf -j","r"); while(!feof($pp)){ $jis_sub=$jis_sub.fgets($pp,1024); } $base64_sub=base64_encode($jis_sub); $mime_sub="=?ISO-2022-JP?B?".$base64_sub."=?="; $pp=popen("echo '$body' | /usr/local/bin/nkf -j","r"); while(!feof($pp)){ $jis_body=$jis_body.fgets($pp,1024); } mail($to,$mime_sub,$jis_body,$header);
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> 半角カナや機種依存文字でなくても化けて だとすると、これはnkfが入力文字列の漢字コード判定を失敗している可能性はありませんか? nkfの入力文字をEUCに決め打ち(-Eオプション)にするとどうでしょうか? 送信元<form>ファイルに <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=EUC-JP"> が書かれていれば、ほとんどの場合EUCでpostされるはずです。(たまに例外もあるようです) レンタル屋さんに「php4.0.6以降にしてくれ」とは言えないんでしょうね、、、
その他の回答 (4)
- GOTTi
- ベストアンサー率25% (2/8)
すでに解決されているかもしれませんが・・・。 初めの方がおっしゃっているように、$body 変数の文字コードが統一されていない可能性があります。 $body の文字列を form 入力値から生成する際に、form 入力値などを適切に EUC に変換する必要があるのではないでしょうか?
お礼
アドバイス有難うゴザイマス。 何分どしろうとなもので、文字コードが不統一だとか、nkfは自動識別だとか(よく考えれば何も入力に指定しないので当たり前なのですが)、formの文字コードは単純に<META>指定とは限らないだとか、全部意識せず突っ走ってきました、ここでいろいろ初めて知り、勉強になりました。 ホント有難うゴザイマス!
- tujige
- ベストアンサー率68% (13/19)
> $body="(formで利用者が入力されたものあり)"; とありますので、form からの入力とハードコーディングされた文字列と混在しているのでしょうか? であれば、複数の文字コードで構成された文字列ということになるでしょうから、nkf では化けると思います。 また、国際化されていない php であれば、下記 URL の jcode.phps がかなり有効ではないでしょうか。 php 4 以上であれば、納得のいく速度だと思います。 ここからはほとんどチャチャですが。。。 あと、selenity さんがおっしゃっていますが、送信される form の内容は form の文字コードで送信される「わけでは」ありません。 ただ、歴史的な経緯でそうなっているだけのようです。 最近では、送信される文字コードは全て UTF-8 にしようという動きもあるそうですので。。。 ただし、現時点ではかなりの確率で form の文字コードで送信されます。 また、php を使用されているのであれば、header 関数を用いて、 header("Content-type: text/html; charset=EUC-JP"); としたほうが、META より効くはずです。 すいません。チャチャでしたね。。。
お礼
ご返事遅れてすみません。 いろいろお教えいただいて有難うゴザイマス。 とりあえずselenity さんに教えていただいた-Eオプションで 様子を見てみます。 header("Content-type: text/html; charset=EUC-JP"); の件やformの文字の送られるコードなど、全然知りませんでした。 めっちゃくちゃ為になりました。有難うゴザイマス!
- selenity
- ベストアンサー率41% (324/772)
本文内の半角カナや機種依存文字の処理は大丈夫ですか? 何かしらの制約でphp-i18n版を使えないのでしょうか? もし、可能であれば「php-3.0.18-i18n-jp2」を使えば、文字コード関連処理の手間がずいぶんと省けますよ。 またはphp4.0.6以降では、i18n系が統合されていますので、php3-i18n版とほぼ同等のi18n関連処理が可能です。
お礼
回答有難うございます。 半角カナや機種依存文字でなくても化けてしまうのです。トホホ (全てDBにインプットしてるのでその文字はわかってます。) ちなみに何がしか半角カナや機種依存文字をはじく方法というのはあるのでしょうか? もしありましたら是非お教えください。 HPはレンタルで借りていて、そこにインストールされているものを使うしかなく、 自分でどうにもできません。いわゆる国際化対応バージョンでないので、こうした処理をしています。そのレンタル屋さんに何とか国際化して欲しいのですが…
- Spur
- ベストアンサー率25% (453/1783)
メールの基本はJISではないですか? EUCでも良いのでしょうか?
お礼
EUCをメール用にJISに変換してます。 その過程で上手くいってないことは確かなのですが… しかし、日本語の文字コードは誰か何とかして欲しいですよね。
お礼
いろいろ有難うございます。 (-Eオプション)で上手く行くような気がします。多分。きっと。 *ちなみに $pp=popen("echo '$subject' | /usr/local/bin/nkf -j -E","r"); でいいんですよね? 色々Webで調べたのですがよくわからず多分こうだろうと… とりあえず設置してみて様子をみます! ホントに有難うございました!