PHP4でプログラムを作っています。

フォームで受けた内容を転送するプログラムです。

フォームのhtmlはEUCとSJISと両方あります。

mb_convert_encodingをつかい、JISに変換して、mb_send_mailで送っています。が、文字化けします。

subjectが最初の14バイト以降が文字化けします。
google等で検索しているのですが、上のJISエンコードしただけでよいというものや、base64を使ってmb_send_mailを使わないのがいいとか、いろいろあって迷っています。
これが決定版みたいな情報があったら教えてください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答7件)

id:ke_ishi No.1

回答回数269ベストアンサー獲得回数0

ポイント23pt

URLはダミーです。質問に答える前に…

subjectの14バイト以降が、というのが理解できません。何か固定の文字列をsubjectの先頭に付加しているのでしょうか?

この文章からでは、subjectだけが文字化けしているのか、本文も文字化けしているのかよくわかりません。

id:takeuchi_k

subjectは固定で「○○からのお知らせです」みたいな文字を入れています。途中から化けます。

subjectは上のような文字化けで、本文はすべて化けています。

分かりにくい書き方ですいません。

2004/11/30 15:21:28
id:ke_ishi No.2

回答回数269ベストアンサー獲得回数0

ポイント23pt

2回目ですが、私は

$mhead = sprintf(”From: %s”, mb_encode_mimeheader(’2バイトのサブジェクト’));

とやってます。

id:takeuchi_k

ありがとうございます。試してみます。

2004/11/30 15:21:53
id:kuippa No.3

回答回数1030ベストアンサー獲得回数13

ポイント23pt

ちょっとやってみただけですが…

自分はタイトルの文字化けは次のように解決しました。サブジェクトだけbase64でエンコード。

$subject = ”=?iso-2022-jp?B?”.base64_encode($subject).”?=”;

本文は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不慣れなので見当違いだったら申し訳ない。

id:takeuchi_k

この方式は試してみたのですが、化けました。

この方式をとったときの届いたメールのヘッダを見ると、

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

と、いかにも怪しげに同じことが二回書いてありました。

単に私がタイプミス等をしている可能性も十分あるので、もっと試してみます。

2004/11/30 15:24:39
id:dgeye No.4

回答回数2ベストアンサー獲得回数0

ポイント23pt

mb_language(”ja”)が必要かどうかは自信が無いのですが(でも自分は入れてます)

subjectに関してはmb_convert_encodingの他にmb_encode_mimeheaderが必要ですがこれは入れました?

自分はこれで mb_send_mailで書いていますが、支障なく送られてきます

id:takeuchi_k

DBから送信者の情報(名前など)を引っ張ってきているのですが、EUCで入っていて、フォームのあるページはSJISですので、mb_convert_encodingにかける前に、文字コードを混在させてしまっているのかもしれません。

もっとよく見てみます。

2004/11/30 15:26:19
id:toitaiki No.5

回答回数123ベストアンサー獲得回数0

ポイント23pt

http://www.implant.ac/

インプラント ネット ‐ 歯科インプラントの総合専門サイト

インプラント療法といいます。

id:takeuchi_k

誤爆ですか?

2004/12/01 14:06:27
id:kuippa No.6

回答回数1030ベストアンサー獲得回数13

ポイント23pt

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)){

#正常終了

}

id:takeuchi_k

ありがとうございます。

2004/12/03 20:12:04
id:kkano No.7

回答回数7ベストアンサー獲得回数0

ポイント22pt

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”);

ちなみにこの質問がずばりそのものかと思います。

id:takeuchi_k

autoで認識できないのではないかと疑ったことが幾度かあったのですが、やはりあるんですね。

2004/12/03 20:13:17

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません