phpのmailの文字コード設定 base64とuni設定


 

phpで普通にmail関数で送信していて、自分もそれで受信して読めるからよいと思っていたが、
ユーザーのメーラーで文字化け。
よくよく受信メールのソースを見てみると、本文の日本語がそのまま読める。
日本語が読めるのは、間違いなのだ。汎用性が低いというか、
Gmailとかが自動的にうまく読ませてくれているだけなのだ。

メールの文字コードは、いろいろなバターンがある。
ただ、汎用性が高いのは、base64形式だろう。

ということで、「base64」で送るための設定をまとめておきます。

メールのヘッダーに

$headers .= "Content-Transfer-Encoding: base64\r\n";

のような形で、base64でエンコードすることを明記しておく。

次に本文をbase64でエンコードする。

する前に、phpでの文字コードの設定もメール送信直前にしておく。

    mb_language("uni");
    mb_internal_encoding("UTF-8");
    $mailbody = base64_encode($mailbody);//mb_send_mail関数で送る場合はいらない

この後に、mail関数で送信する。
mail関数は内部では、エンコードしないので、上記のようにエンコードしておくことが必要
mb_send_mail関数は、内部で自動エンコードするので、base64のエンコードは必要ない。

これが重要です。

メーラー自体がだんだんと賢くというか、対応するようになっているので、問題ないケースもあるけど。

昔は、もっとややこしかったような気がします。
たしか、件名はJISで送るとかがあったような。
ググると、いろんな情報が出ています。
いろんなパターンをやりましたが、件名はなにもしないと、UTF-8なので問題ありませんでした。
(最近は、スクリプト内やDBはUTF-8という前提です。)

WEBプログム、WEBデザインなどの制作については、以下を御覧ください。

WEBプログム、WEBデザインなどの制作