UTF-8で作成したフォームをsend_mailすると文字化け PHP5 - PHPプロ!Q&A掲示板

636

  • 0P

UTF-8で作成したフォームをsend_mailすると文字化け PHP5

質問日時 / 2007年9月9日 19:23    回答数 / 7件

Questioner:  docopon  このエントリーをはてなブックマークに追加 

キーワード / UTF-8    文字化け    send_mail   

PHP5を使用していますが、

UTF-8で作成したフォームに入力された2バイト文字(日本語)をsend_mailでメールすると、本文が文字化けしてしまいます。

下記URLなども参照したのですが、実際はどのようにしてよいのか分かりません。
  1. URL: http://www.res-system.com/item/478

このURLでは、UTF-8の対処法として「mb_language関数、mb_internal_encoding関数を、
mb_send_mail関数の前に呼び出します。」
  1. ■送信文字がUTF-8の時の呼び出し例
  2.   mb_language('Japanese');
  3.   mb_internal_encoding("UTF-8");
  4.   mb_send_mail('test@test.com', 'タイトル', '本文','From:aaa@aaa.com');
とありますが、これでよいのでしょうか?

しかし、下記URLなどには、そもそもmb_send_mailは、使用しないようにと言われています。
  1. URL: http://hain.jp/index.php/tech-j/2007/02/13/%EF%BC%B0%EF%BC%A8%EF%BC%B0%E3%81%AE%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91

私のphp.iniなどの現設定などもここに記載できれば良いのですが、どの部分が文字化けと関連しているのか良く分かりません。

よろしくお願いします。

キャサリン

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01natsumickeynatsumickeyと申します。 私も、PHP5+UTF-8のフォ
┃┣A01-1docoponnatsumickeyさん ご回答ありがとうございました。
┃┣A01-2docoponnatsumickeyさん 少しお聞きしたいのですが、natsu
┃┣A01-3docoponnatsumickeyさん >>CODE mb_encode_mimeheader("
┃┗A01-4docoponnatsumickeyさん natsumickeyさんに教えていただい
┗A02cockokSubjectはmb_encode_mimeheaderを通す必要があります
 ┗A02-1docoponcockokさん ご回答ありがとうございました。 下記

回答一覧

並び替え:

A01 満足
answerernatsumickey [9月10日 17:08]

natsumickeyと申します。

私も、PHP5+UTF-8のフォームから以下の方法でメール送信していますが、
文字化けは起きていません。

  1. mb_internal_encoding("UTF-8");
  2. mail("Toアドレス",mb_encode_mimeheader("タイトル",'JIS','B'),mb_convert_encoding("本文",'JIS'),"From: Fromアドレス");

また、キャサリンさんが引用されているmb_send_mailを使った方法でも
実現可能だとは思います。

試してみてください。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerdocopon [9月10日 20:40]

natsumickeyさん

ご回答ありがとうございました。
一度、試してみます。

キャサリン

この意見に回答する

ツリーへ TOPへ

A01-2
replyerdocopon [9月10日 21:30]

natsumickeyさん

少しお聞きしたいのですが、natsumickeyさんの下記コード中の
  1. mb_encode_mimeheader("タイトル",'JIS','B'),
「B」とは、何を意味するのでしょうか?

キャサリン

この意見に回答する

ツリーへ TOPへ

A01-3
replyerdocopon [9月10日 21:35]

natsumickeyさん

  1. mb_encode_mimeheader("タイトル",'JIS','B')
のBがデフォルト(Base64)であるとこちらで判明しました。

お知らせまで。

キャサリン

この意見に回答する

ツリーへ TOPへ

A01-4
replyerdocopon [9月10日 22:18]

natsumickeyさん

natsumickeyさんに教えていただいたコードで文字化けせずにメールが送信できました。
ありがとうございました。mb_send_mailは、使用せずに、natsumickeyさんと同じmailを使用しました。

ところで、もう少しお聞きしたいのですが、私はフォームにデータを入力するファイル(enter.html)、それをチェックするファイル(check.php)及びデータをメールで送信するファイル(mail.php)を分離しています。

これらのファイルでブラウザーにファイルのHTMLコードが出力されるのは、データを入力するファイル(enter.html)及びそれをチェックするファイル(check.php)だけです。これらには、<meta http-equiv="Content-Type" content="text/html; charset=utf-8">とHTMLヘッダー内に記述しているのですが、データをメールで送信するファイル(mail.php)にもmeta http-equiv="Content-Type" content="text/html; charset=utf-8">とHTMLヘッダー内にエンコード形式を記述する必要はあるのでしょうか?

ここにおられる方で誰かご存知ですか?


キャサリン

この意見に回答する

ツリーへ TOPへ

A02 参考になった
answerercockok [9月10日 20:10] (最終編集:9月10日 20:20)

Subjectはmb_encode_mimeheaderを通す必要があります。
  1. mb_language('ja');
  2. mb_internal_encoding('UTF-8');
  3. mb_send_mail('to@example.jp', mb_encode_mimeheader('タイトル'), '本文', 'From: from@example.jp');
mb_send_mailは、他のmbstring関数と違いinput、outputの設定を引数に持たず混乱するかも知れませんが
・inputはmb_internal_encording()
・outputはmb_language() ja、japaneseだった場合はISO-2022-JP
以上を抑えて抑えれば文字化けに悩むことなく利用できるかと思います。

この意見に回答する

ツリーへ TOPへ

A02-1
replyerdocopon [9月10日 20:53]

cockokさん

ご回答ありがとうございました。
下記が私の現在のメール送信部分のコードです。まだ教えていただいた改良は加えていません。
  1. // メール本文を組み立てます。
  2. $title2 = "=?iso-2022-jp?B?".base64_encode($title)."?=";
  3. $naiyou2 = "お名前:$name\n
  4. メールアドレス:$from\n
  5. タイトル:$title\n
  6. 内容:$naiyou\n";
  7.  
  8. if ($name != "" and $from != "" and $title != ""
  9.  and $naiyou != "" ) {
  10.     if (mail($to, $title2, $naiyou2, "From:$from")) {
  11.         echo "メールを送信しました";
  12.     }
  13.     else {
  14.         echo "メール送信失敗です";
  15.     }
  16.  
  17. }

上記のcockokさんのコメントで、
>・outputはmb_language() ja、japaneseだった場合はISO-2022-JP
>以上を抑えて抑えれば文字化けに悩むことなく利用できるかと思います。
の意味が分かりませんが、私のメール送信用コードで言うところの
  1. $title2 = "=?iso-2022-jp?B?".base64_encode($title)."?=";
のことでしょうか?

キャサリン

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)