いわゆる半角カナや種依存文字などをメールで送信する方法

随分前から書こうと思っていて忘れていたのですが、役に立つ人がいるかもしれませんので、書いておきたいと思います。

メールの送信エンコーディングUTF-8 を使用すれば、機種依存文字という問題を気にする必要はほとんどありませんが、まだ一般的には、ISO-2022-JP を使用してメールを送る方が多いと思います。ただ、PHP の mb_send_mail() では、いわゆる半角カタカナや、機種依存文字を送信することはできません。これらの文字は '?' に変換されます。

PHP 5.2.1 からは、レガシーエンコーディングの追加として、ISO-2022-JP-MS というエンコーディングが追加されました。ISO-2022-JP-MS を使用すれば、このエンコーディングでサポートされている文字を送信することができます。ISO-2022-JP-MS については、[PHP-dev 1345] PHP への CP932 系エンコーディングの追加パッチを参照してください。

ISO-2022-JP-MS を使用してメールを送信するには、mb_send_mail() ではなく、mail() を使用し、メールヘッダなどを定義します。例えば、関数化すると以下のようになります。

<?php
function send_mail( $subject, $msg_body, $to_addr, $from_addr )
{
//      言語設定は Japanese、内部文字エンコーディングは UTF-8 を使用していることを想定
//	mb_language( 'Japanese' );
//	mb_internal_encoding( 'UTF-8' );

	$subject      = mb_encode_mimeheader( $subject, 'ISO-2022-JP-MS', 'UTF-8' );
	$mailto       = $to_addr;
	$body         = mb_convert_encoding( $msg_body, 'ISO-2022-JP-MS', 'UTF-8' );
	$add_headers  = "Content-Type: text/html; charset=ISO-2022-JP\n"
	              . 'From:' . mb_encode_mimeheader( $from_addr, 'ISO-2022-JP-MS', 'UTF-8' );

	return mail( $mailto, $subject, $body, $add_headers );
}

実用する場合は、Envelope From の設定や、メールアドレスチェックを行った方が安全です。また、受信側で必ずしもこれらの文字が正しく読めるかどうかは分からないことには注意してください。