フォームで受けた内容を転送するプログラムです。
フォームのhtmlはEUCとSJISと両方あります。
mb_convert_encodingをつかい、JISに変換して、mb_send_mailで送っています。が、文字化けします。
subjectが最初の14バイト以降が文字化けします。
google等で検索しているのですが、上のJISエンコードしただけでよいというものや、base64を使ってmb_send_mailを使わないのがいいとか、いろいろあって迷っています。
これが決定版みたいな情報があったら教えてください。
URLはダミーです。質問に答える前に…
subjectの14バイト以降が、というのが理解できません。何か固定の文字列をsubjectの先頭に付加しているのでしょうか?
この文章からでは、subjectだけが文字化けしているのか、本文も文字化けしているのかよくわかりません。
2回目ですが、私は
$mhead = sprintf(”From: %s”, mb_encode_mimeheader(’2バイトのサブジェクト’));
とやってます。
ありがとうございます。試してみます。
http://php.s3.to/man/function.base64-encode.html
base64_encode
ちょっとやってみただけですが…
自分はタイトルの文字化けは次のように解決しました。サブジェクトだけbase64でエンコード。
$subject = ”=?iso-2022-jp?B?”.base64_encode($subject).”?=”;
http://php.s3.to/man/function.mb-convert-encoding.html
mb_convert_encoding
本文はmb_convert_encodingでコンバートして、これらをmb_send_mailで送ります。
文字化けの問題はこれで解決するかと思います。
ちなみにヘッダーは
$header .= ”Content-Type: text/plain;charset=iso-2022-jp”;
mb_convert_encoding($message, ”iso-2022-jp”, ”auto”)
こんな感じで
if(mb_send_mail($address_to,
$subject,
mb_convert_encoding($message, ”iso-2022-jp”, ”auto”),
$header)){
これで送ります。
PHP不慣れなので見当違いだったら申し訳ない。
この方式は試してみたのですが、化けました。
この方式をとったときの届いたメールのヘッダを見ると、
MIME-Version: 1.0
Content-Type: text/plain;charset=ISO-2022-JP
Content-Transfer-Encoding: base64
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit
と、いかにも怪しげに同じことが二回書いてありました。
単に私がタイプミス等をしている可能性も十分あるので、もっと試してみます。
http://php.benscom.com/manual/ja/function.mb-encode-mimehead...
PHP: mb_encode_mimeheader - Manual
mb_language(”ja”)が必要かどうかは自信が無いのですが(でも自分は入れてます)
subjectに関してはmb_convert_encodingの他にmb_encode_mimeheaderが必要ですがこれは入れました?
自分はこれで mb_send_mailで書いていますが、支障なく送られてきます
DBから送信者の情報(名前など)を引っ張ってきているのですが、EUCで入っていて、フォームのあるページはSJISですので、mb_convert_encodingにかける前に、文字コードを混在させてしまっているのかもしれません。
もっとよく見てみます。
http://www.wakaru-implant.com/
わかるインプラント - 歯科インプラント治療の相談
二回目の回答です。URLは誤爆です。
ソースをそのままは張りたくないのだけど、
私はコンナ感じで組んでみました。ヘッダーが重なるのはもしかしたら違うところで設定があるからかもしれません。ヘッダーに細工をせず送ってみて確認されてはいかがでしょうか。
ちなみに、win鯖とlinux鯖では下記の記述で送信できました。…ぁ。PHP5かも。
$response = ””;
$address_to = $_POST[’to’];
$address_from = $_POST[’from’];
$name_from = $_POST[’name’];
$subject = $_POST[’subject’];
$message = $_POST[’message’];
$header = ”From: *****@****.**.**¥n”;
$header .= ”Reply-To:”.$address_from.”¥r¥n”;
$header .= ”Content-Type: text/plain;charset=iso-2022-jp”;
mb_language(”Japanese”);
$subject = ”=?iso-2022-jp?B?”.base64_encode($subject).”?=”;
$message = $address_from.”¥r¥n”
.$name_from
.” ______________________¥r¥n”
.” ______________________。¥r¥n¥r¥n”
.$message;
#メール送信
if(mb_send_mail($address_to,
$subject,
mb_convert_encoding($message, ”iso-2022-jp”, ”auto”),
$header)){
#正常終了
}
ありがとうございます。
http://jp2.php.net/manual/ja/ref.mbstring.php
PHP: マルチバイト文字列関数(mbstring) - Manual
おそらくphpの内部段階の文字コード認識に失敗して、間違った値を$_POSTに
貰っている可能性があります。
こう設定して変換を無効にし、mb_detect_orderで自力で文字を認識してみるとどうでしょうか。
ini_set(”mbstring.http_input”, ”pass”);
ini_set(”mbstring.encoding_translation”, ”Off”);
ちなみにこの質問がずばりそのものかと思います。
autoで認識できないのではないかと疑ったことが幾度かあったのですが、やはりあるんですね。
subjectは固定で「○○からのお知らせです」みたいな文字を入れています。途中から化けます。
subjectは上のような文字化けで、本文はすべて化けています。
分かりにくい書き方ですいません。