- ベストアンサー
メール送信プログラムで特定文字の文字化け
PHP初心者です。メール送信プログラムを作成しました。 色々調べて、 //表・予・申・能・十・ソなど特殊漢字の後につく\マークを削除 変数 = stripslashes(変数); でエンマークはとれたのですが、また新たな問題が発生してしまいました。 例えば、山本という名前でフォーム入力すると本という文字が文字化けしてしまいました。送信者名は文字化けしていないのにメールの中身の本という文字が文字化けしてしまいました。どなたか助けてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
真ん中下あたりの >$s_msg = mb_convert_encoding($s_msg,"JIS","SJIS"); ここでJISコードに変換しているにも拘らず、その下の >$s_msg = stripslashes($s_msg); で本来は必要な'\'を取り除いてしまっているのです。 「本」のJISコードは0x4b5c、つまり"K\"ですから当然コードが変化してしまいます。 送信者名が化けないのは、この処理を$from対して行っていないためです。 変数内の文字コードと文字列の状態を理解しながらプログラミングすると良いでしょう。 それと、マルチバイトメール送信関数 >mb_send_mail($sendto, $subject, $s_msg, $from); では、本文及び標準のヘッダに含まれるSubjectは"内部文字エンコードで渡し"ます。 追加ヘッダ($from)は"メール用にエンコード"した上で、適切なフォーマットで渡します。 追加ヘッダのエンコードにはmb_encode_mimeheader()を使えば、メール向けの適切なフォーマットで返してもらえます。
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
どういう処理をいれているのでしょうか? 送信者や件名などはISO-2022-JP形式、 本文は7bitJIS形式にきちんと変換していますか?
補足
早速のご回答ありがとうございます。 以下の内容でメール送信しています。ちなみにこの上でfopenでlogを残していますがそちらには文字化けせず残されているのでメール送信用プログラム内で何か追加しなければいけないんだと思いますが、調べていても答えがみつかりません。お願いします。 //----------------ここから管理者宛にMAIL送信------------------------// $subject="お問い合わせがありました!"; $subject=mb_convert_encoding("$subject","JIS","SJIS"); $subject=mb_encode_mimeheader($subject); //表・予・申・能・十・ソなど特殊漢字の後につく\マークを削除 $content = stripslashes($content); $name = stripslashes($name); $s_msg="以下の内容でお問い合わせ・資料請求がありました。 迅速な対応をお願いいたします。\n _/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄\n ■お名前:${name} ■ふりがな:${name2} ■メール:${e_mail} ■生年月日:${birth_year}年${birth_month}月${birth_day}日 ■お問い合わせ:\n${content01}\n _/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄_/ ̄\n |お問い合わせフォーム|\n \n"; $s_msg = mb_convert_encoding($s_msg,"JIS","SJIS"); mb_internal_encoding("SJIS"); mb_language("Japanese"); $from="${name}"; $from=mb_convert_encoding("${from}","JIS","SJIS"); $from = base64_encode($from); $from = "=?ISO-2022-JP?B?" . $from . "?="; $from = "From: \"".$from. "\"" . "<" . "$e_mail" . ">"; //表・予・申・能・十・ソなど特殊漢字の後につく\マークを削除 $s_msg = stripslashes($s_msg); mb_Language('Japanese'); $sendto = "midori@mosk.co.jp"; mb_send_mail($sendto,"$subject","$s_msg","$from"); //-------------------------------------------------------------------------------------//
お礼
ありがとうございます。数日前にこれに気づき解決いたしました。 でもひとつひとつ関数の意味を理解していなかったのでnataruyさんのご回答でなぜそうなったのかようやく意味がわかりました。本当にありがとうございました。