読者です 読者をやめる 読者になる 読者になる

PHPでMIMEエンコーディング

PHPでメール送信をするには、そう、日本語を使うなら mb_send_mail() 関数です。subjectとか本文とか、適切にエンコーディングしてくれるので楽ですね。
ただ、mb_send_mail() の自動エンコーディングには漏れがあって、追加ヘッダに対してはまったく働いてくれません。From に日本語を使おうとすると、自前でエンコーディングしないといけなくなります。
ヘッダをMIME変換するくらい、mb_convert_mimeheader() を使えばいいじゃないかとすぐ思われる方、微妙に惜しい。この関数は文字列の中に日本語を見つけると、以降の文字列はすべてまとめてMIME変換してくれちゃいます。From でこれをやられると、「From: 名前 」の後半が全部MIME変換されちゃって、有効なFromでなくなってしまうのね。
これは、テンプレートファイルから読み込んだ任意のヘッダでメールを送るなんて時に困ります。
そこで、日本語の部分だけを選択的にMIME変換してくれる関数を作ります。preg_split() を活用します。

function mime_head($str){
  $arr =
    preg_split("/([\x8E\x8F\xA1-\xFE]+)/",$str,-1,PREG_SPLIT_DELIM_CAPTURE );
  for($i=1; $i

あらかじめ内部言語と内部エンコードはja、EUCに設定した上で使ってください。