ホームページのお問い合わせを作成中に少しハマったので備忘録として。
お問い合わせのページを作成時に、簡単に処理しようとするとメールの送信処理が必要になります。私の使っているレンタルサーバーの場合はPHPを使用しているので、mb_send_mailを利用するのが良いかなと思い実装しているとタイトルは問題ないけど、本文が「?????」になっていました。
色々と調べると「mb_send_mail」「mb_language」「mb_internal_encoding」「php.ini」「文字コード」などがキーワードっぽいので、調べた結果と取った手段を記載します。
mb_send_mail
本家の説明によると、宛先やタイトル、本文などを引数にこの関数を呼ぶとメールが送信(サーバーが対応していれば)されるという事でした。文字列を扱うのときに考慮しないといけない事に「文字コード」「エンコード」があります。
「文字コード」はUTF-8やJISなどの文字に対するコードで、種類はたくさんありますが、私は世の中「UTF-8」で回ってると信じてます。エディタなどの設定は基本OS問わず「UTF-8」に設定しています。「エンコード」は文字をコードにするための処理で数種類ありますが、基本的には意識しなくても必要があれば変換してあげるだけで問題ないと思ってます。
で、本題に戻ると「引数に渡す文字コード」を色んなところで指定・参照している事が原因で注意が必要でした。
文字コードの指定
mb_language
本家によると、「e-mail メッセージのエンコーディングとして使用します。 有効な言語の一覧は、以下のテーブルで示します。 mb_send_mail() は、e-mail をエンコードする際にこの設定を使用します。」との記載があるので、mb_send_mailを使用する場合は明示的に示した方が良いと思い、処理の最初でコールしました。
上の表にあるのが引数のリストで「Japanese」もしくは「ja」を渡すと日本語が使えるようになる雰囲気を醸し出しますが、実際に使われる文字コードは「ISO-20220JP(JIS)」になります。ググると呪文のようにこれをコールしている事が多いので、罠の一つとして注意が必要です。
mb_internal_encoding
本家によると、「encoding
は、HTTP 入力文字エンコーディング変換、 HTTP 出力文字エンコーディング変換および mbstring モジュールの文字列関数においてデフォルトの文字エンコーディングとして使用されます。 マルチバイト正規表現用のエンコーディングは、ここで扱う内部文字エンコーディングとは別であることに注意してください。」という事なので、HTTPでの入出力文字コードの指定という事になるのかな。ここはもちろん「UTF-8」を指定ですね。これも明示的にコールした方が良いと思われます。サーバーによって違うでしょうから。
php.ini
mb_send_mailでの文字化けを調べていると遭遇するのが「php.iniの値がどうなってるか調べろ」的な情報で、私の環境でいくつか調べてみたところ、以下の状況でした。
mbstring.internal_encoding | UTF8 | -がないのは意図的なのだろうか… |
default_charset | UTF-8 | まぁ普通そうだよね |
私の環境ではphp.iniは参照のみで変更できないので、確認のみですが、基本「UTF-8」なので問題ない感じでしょうか。
雑感
で、結局どうしたのって言うのは以下のコード参照のこと。まぁネットで調べたものコピペしてちゃだめよって話ですね(汗。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
mb_language("uni");
mb_internal_encoding("UTF-8");
$name = $_POST['name'];
$affi = $_POST['affi'];
$email = $_POST['email'];
$tel = $_POST['tel'];
$to = $email;
$bcc = "";
$subject = $name;
$subject .= "様からのお問い合わせ内容";
$header = "From: $bcc";
$header .= "\r\n";
$header .= "Bcc: $bcc";
$header .= "\r\n";
$header .= "Content-type: text/plain; charset=UTF-8";
$message = $_POST['content'];
$body = "お問い合わせありがとうございました。数日中に返信致しますのでしばらくお待ち下さい。\r\n\r\nお名前|$name 様 \r\n所属企業・団体|$affi \r\nメールアドレス|$email \r\n電話番号|$tel \r\n\r\nお問い合わせ内容|$message \r\n\r\n";
if( mb_send_mail($to, $subject, $body, $header) ){
$result = "送信完了";
}else{
$result = "エラーが発生しました。";
}
};
?>
コメント