前のページでは、WindowsやMacのメールソフトを使ってのメール送信方法について解説しました。ここでは、WEBプログラムで利用可能なように、PHPを例題に、どのようにUTF-8のメールをWEBアプリで送信可能かを解説します。
メール関数の一つであるmb_send_mail()関数はmb_language()の設定値を参照しますが、一般的なレンタルサーバの場合、mb_language() の設定は、「Japanese」になっていると思います。この場合、PHPのマニュアルにもありますように、「ISO-2022-JP/Base64」がエンコードとして用いられます。ですが、メール送信プログラムを含むPHPファイルの中で、mb_language("uni")をコールすることで、「UTF-8/Base64」に設定を一時的に設定を変更することが可能です。
<?php
//***********************************************************************
// このプログラムはUTF-8で作成されているものという前提で書かれています。
// mbstring.languageの設定が「Japanese」になっている場合にUTF-8のメール
// を送信するためのサンプルプログラム・No.1。
// メールのエンコードをUTF-8にすることで、一般的なISO-2022-JPでは機種依
// 存文字とされている「①ⅱ㈱℡」などの特殊文字がほとんど問題なく使える
// ようになります。また、「髙塚彅﨑德」などの拡張文字も、MacOSXでない古
// いOSの場合を除いて、ほぼ問題なく使えるようになります。「髙田さん」や
// 「山﨑さん」、「大塚さん」「德野さん」「草彅さん」へのメール送信で、
// 「文字化けしているよ。バグっているのでは?」というクレームを受けなく
// て済みます。
// さらには、「안녕하세요」のような韓国語(ハングル文字)も、送信可能に
// なります。それぞれの文字種につき、メールソフト側での対応(表示状況)
// についてはこちらを参照してください。
//***********************************************************************
ini_set("mbstring.internal_encoding","UTF-8"); //このプログラムがUTF-8で書かれていることを宣言。
$subject = "テストです。アイウロエ①ⅱ㈱℡髙塚彅﨑德안녕하세요"; //メールの件名
//本文の準備
$body = "mb_language()関数でテストした本文テストです。アイウエオ①ⅱ㈱℡髙塚彅﨑德안녕하세요";
//本文もBase64エンコードしておく。これをしないと文字化けします。
//しかし、Windows版のPHP4.3.3では、base64エンコードすることにより、
//base64エンコードされたままの表示になり、かえって文字化けしました。
//環境によって文字化けする場合は、本文をbase64エンコードすることはしないでください。
$body_b = base64_encode($body);
mb_language("uni"); //Unicode(UTf-8)でメール送信するための宣言。この宣言により、mb_send_mail()関数利用時に、下記の赤字のヘッダーが自動付与され送信されます。
//Content-Type: text/plain; charset=UTF-8
//Content-Transfer-Encoding: BASE64←「本文もBase64エンコードしています」という宣言。
//サブジェクトが長い場合は自動的に分割してくれます。
//実際にメール送信
mb_send_mail("hoge@example.com",$subject,$body_b,"From: hogehoge@example.com");
print "success";
?>
|
このように、メール送信プログラムを含むPHPファイルの中で、mb_language("uni")をコールすることで簡単にUTF-8のメールを送信することが可能です。
PHPでUTF-8のメールを送信するための今ひとつの方法は、popen関数を用いて、自前で、メールヘッダーも付与するやり方です。これであれば、仮に「Base64エンコードには対応していなくて、Quoted-Printableでエンコードしていなければ、受信しても文字化けしてしまう」というメールソフトの利用者にメールを送信する場合でも、UTF-8のメールを送信可能になります。
<?php
//***********************************************************************
// このプログラムはUTF-8で作成されているものという前提で書かれています。
// mbstring.languageの設定が「Japanese」になっている場合にUTF-8のメール
// を送信するためのサンプルプログラム・No.2。
// 本文中に「\」と表示されている場合、円マーク(\)と同値です。読み替えてください。
//***********************************************************************
ini_set("mbstring.internal_encoding","UTF-8"); //このプログラムがUTF-8で書かれていることを宣言。
$subject = "テストです。①ⅱ㈱℡髙塚彅﨑德안녕하세요";//メールの件名
$subject_b = mb_encode_mimeheader($subject,"UTF-8");
//本来はサブジェクトが長い場合は、RFC2047により複数行に分割すべきですが、
// mb_encode_mimeheader関数が勝手にやってくれます。
// しかし、RFCがいう「76文字以内」というのがどこからどこまでを指すのかによりますが、
// mb_encode_mimeheader関数の処理結果のが1行が長すぎると感じられるなら、
// こちらのプログラムのような要領で自前で分割処理すると良いかもしれません。
//本文の準備
$body = "안녕하세요\n①ⅱ㈱℡髙塚彅﨑德\nUTf-8でのメール送信テストです。";
$body_b = base64_encode($body);//・・・①
$from = "hoge@example.com";
$to = "hogehoge@example.com";
// メールの送信
$mailPipe = popen("/usr/sbin/sendmail -f $from $to", "w"); //sendmailのパスは各自の環境に合わせる必要がありますし、引数となるメールアドレスなどのチェックは十分に行っていないと、セキュリティホールになります。
//ヘッダー部分を書き込んでいく
fputs($mailPipe, "MIME-Version: 1.0\n");
fputs($mailPipe, "Content-Type: text/plain; charset=utf-8\n");
//「①」の部分でエンコードをここで指定する。例の場合は「base64」なので、下記のようにし
//ます。もし、Quoted-Printableでエンコードしたのなら、そのように下記のヘッダー部分で
//宣言しなければなりません。仮に、本文をエンコードせずにそのまま送信してしまいたい場
//合は、「①」のエンコード処理は行わずに、下記のヘッダー部分を
//「Content-Transfer-Encoding: 8bit\n」とします。
fputs($mailPipe, "Content-Transfer-Encoding: base64\n");
fputs($mailPipe, "From: $from\n");
fputs($mailPipe, "To: $to\n");
fputs($mailPipe, "Subject: $subject_b\n");
fputs($mailPipe, "\n"); //ヘッダー終了
//本文を書き込んでいく
fputs($mailPipe, "$body_b\n");
//パイプへのファイルポインタを閉じて、メールを送信する
pclose($mailPipe);
print "success";
?>
|
以上のような方法で、PHPからもUTF-8のメールを送信することが可能になります。perlを使ったCGIプログラミングでも、後者の方法とよく似たやり方(sendmail+パイプ)で送信可能です。次のページで見てみましょう。
|