メールの文字コードに関して、色々ごまかしながらやってましたが真面目に取り組む必要があり、ここでメモ。
前提条件
メール送信のプログラム自体はUTF-8で保存。PHPならmb_internal_encoding(“UTF-8”)を忘れない。
ヘッダー部分
大事なこととして、メール本文とヘッダー部分に関しては切り離して考える必要あり。ヘッダー部分はFromやSubjectなどの情報ですね。どちらかと言うとこっちの方が本文より文字化けしやすい印象です。
簡単にまとめると以下のような感じ。
- もともとの経緯で古い環境だと7bit文字しか使えずUTF8が文字化けする可能性がある。
- そのためISO-2022-JPで送る必要あり。
- ただし、マルチバイト言語を使う場合、base64と言うエンコーディング方式で変換する必要がある
例えばPHPであれば下記のような処理をしてヘッダーを処理することが一般的です。
1 2 3 4 5 |
//書き方その1 $subject = "=?iso-2022-jp?B?".base64_encode(mb_convert_encoding("メールの件名です","JIS","UTF-8"))."?="; //書き方その2(書き方1をmb_encode_mimeheaderで代用したもの) $subject = mb_encode_mimeheader('日本語サブジェクト', 'ISO-2022-JP', 'UTF-8'); |
このような方法で送るとメール送信時のログが下記のようになっているはずです。
1 2 |
From: =?ISO-2022-JP?B?GyRCJTUlcyVXJWslYSE8JWsbKEI=?= <メールアドレス> Subject: =?ISO-2022-JP?B?GyRCIVokNE8iTW0hWyQ0MCc7IiVhITwlayRyQXckaSQ7JEYkJCQ/GyhC?= |
メール本文
色々調べましたが、全環境でOKな方法はないようです。
ISO-2022-JPかUTF-8のどちらかで送るのが一般的なようです。
今メールボックスにきているメールのソースを見てみましたが半々ぐらいでしたね・・・
Content-Transfer-Encoding
Content-Transfer-Encodingはメール本文の変換方法ですが、ISO-2022-JPの場合は7bitとするのが一般的なようです。UTF-8の場合は指定に際して記述がありませんでしたね・・実際のメールでは8bitとbase64が多いようです。
メールの文字コードですが、ややこしいことに適当な方法で書いても環境によってはうまくいってしまうことが多々あります。(文字化け全般に繋がることですが・・)
参考リンク