PHPには、Eメールで必須のbase64エンコードに必要な関数が用意されています。しかし、そもそもbase64について知らないようでは、その関数を使いこなせません。
そこで今回は、base64エンコードが必要となるEメールの基本と、PHPにおけるbase64を扱う関数の使い方について詳しく解説します。
目次
Eメールで利用されるbase64の基本
今では、Eメールを扱う便利なライブラリが幾つもあるので、base64を使ったプログラムを新規に書いた経験のある方は少ないかもしれません。
しかし、PHPに限らず、base64は多くのプログラム言語に実装されている機能の1つです。古いシステムを改修する場合などに、目にする機会があるもしれません。まずは、base64の基本について解説します。
base64の基本
base64は、数字、アルファベットの大文字と小文字、記号の64文字のみを使い、7ビットのアスキー文字しか送信できない環境で、マルチバイト文字やバイナリデータを扱うためのエンコード方式です。
なお、base64という名称は、64を基数とするエンコード方式が由来です。また、base64の仕組みは、多くのプログラム言語に組み込まれており、PHPでも利用できます。
base64はEメールで使われる仕組み
昔、インターネットが普及していなかった時代は、電話回線を利用し、アスキー文字しか送信できない仕組みが幾つもありました。そのような昔の仕様で今も運用されているのがEメールです。
なおEメールに関する規約は、1980年代にSMTPとして標準化された古い仕組みです。そして、SMTPは、テキストベースのプロトコルで、全ての要求や応答やEメールの本文が7ビットのアスキー文字でなければなりませんでした。
これでは、日本語の全角文字はもちろん、添付するファイルもそのままではEメールで送れません。そこで使われたのが、base64で7ビットのアスキー文字に変換する方法です。そしてbase64は国際規約として規定されており、今のEメールシステムでも使われています。
base64の利用例
先ほど、base64はEメールの仕組みで使われる機能の1つと説明しましたが、他にも利用例があります。例えば、Webページの認証に使われるBasic認証に使われてます。また、電子掲示板に使われるケースもありました。
とはいえ、いずれのケースでも専用のライブラリなど使うことで、base64を意識しなくてもプログラムを作成できます。そのため、何年もプログラマーとして働いているものの、PHPでbsse64を使うプログラムを書いたことがない、という方がほとんどかもしれません。
PHPのbase64を扱う関数の基本
先ほど説明したように、base64は、バイナリーデータを7ビットのアスキー文字のみを使用した文字列に変換するエンコード方式です。次から、PHPにおけるbase64を扱う関数について解説します。
base64_encode
base64_encode関数は、引数で指定したデータをbase64でエンコードして返します。
base64_encodeの書き方
base64_encode( データ )
例えば、$dataに格納されたバイナリデータを、base64でエンコードして、$outに出力する例は次の通りです。
1 2 3 |
base64_encodeの例 $out = base64_encode( $data ); |
base64_decode
base64_decode関数は、引数にbase64形式でエンコードされた文字列を指定すると、元のバイナリーデータに変換して返します。なお、変換に失敗した場合の戻り値はfalseです。
base64_decodeの書き方
base64_encode( base64でエンコードされた文字列 )
なお、2番目の引数にtrueを指定すると、入力されたbase64エンコードされた文字列をチェックし、base64に使われない文字が含まれている場合はfalseを返します。
base64_encode( base64でエンコードされた文字列, true )
例えば、$dataにbase64エンコードされた文字列が格納されている場合、元の文字列に変換して$outに出力する例は次の通りです。
1 2 3 |
base64_encodeの例 $out = base64_encode( $data ); |
PHPでメールを送信するには
PHPでEメールを送信する場合、簡単に使えるライブラリを利用するケースが多いことから、mail関数を利用して、添付ファイル付きのEメールを送信するプログラムを作るケースは少ないかもしれません。
しかし、PHPの標準のmail関数でも、添付ファイル付きのEメールを送るプログラムの作成は可能です。次から、添付ファイル付きのEメールを送信するための基本と、base64_encode関数の使い方を紹介します。
PHPでEメールを送信するための基本
今は、PHPで使えるEメール送信ライブラリには多機能なものが多く、base64によるエンコードを意識する必要はありません。しかし、PHPに標準で組み込まれているmail関数を使う場合は、規約に合わせてEメール本文を作成する必要があります。
なお、mila関数は、あて先、メールタイトル、本文の3つを指定すれば、Eメールを送信できる関数です。しかし、そのまま送信してしまうので、日本語や添付ファイルをそのまま送信すると、文字化けしてしまい読めません。そこで、base64_encode関数によるエンコードが必要です。
さらに、mail関数を使ってEメールにファイルを添付する場合、通常省略可能な4つの目の引数を使い、ヘッダー情報として添付ファイルがあることを追加する必要があります。
バイナリデータの説明書きが必要
base64でエンコードしたバイナリデータをEメールの本文に付ける場合、その説明書きが必要です。メールクライアントソフトは、この説明書きを基に、Eメールに添付されたbsse64でエンコードしたデータを元のファイルに戻します。
1 2 3 4 5 6 7 8 9 10 |
バイナリデータの説明書きの例 --__BOUNDARYBOUNDARYBOUNDARY__ Content-Type: application/octet-stream; name="fax.pdf" Content-Disposition: attachment; filename="fax.pdf" Content-Transfer-Encoding: base64 (ここに、"fax.pdf"をbase64でエンコードして作った文字列を挿入する) --__BOUNDARYBOUNDARYBOUNDARY__-- |
この例は、base64でエンコードした「fax.pdf」をEメールに添付するための、バイナリデータの説明書きの例です。なお、1行目の「–__BOUNDARY」以降の文字列は、乱数などを使ってユニークな文字列を作るのが一般的です。また、最後に1行目と同じ文字列を追加します。
なお、日本語のファイル名を指定した場合は、そのファイル名もエンコードするので、今回紹介した例よりも複雑です。
エンコード済みのデータを添付する方法
バイナリファイルをbase64でエンコードした文字列をEメールに添付する場合、Eメールの規約で1行として送れる文字数が決まっているので、そのままでは送れません。PHPのchunk_split関数で適切な長さに分割し、それをEメールに添付します。
そのため、次の例のように、base64_encode関数とchunk_split関数が同時に使用します。
1 2 3 |
ファイルをbase64でエンコードしEメールに添付する例 $body .= chunk_split(base64_encode($filebody)); |
この例は、あらかじめファイルから変数$filebodyに読み込んだバイナリデータを、base64_encode関数でエンコードし、さらにchunk_split関数を使いEメールで送れる長さに分割した後、Eメールの本文を格納する変数$bodyに追加しています。
そして、この前後に、先ほど紹介したバイナリデータの説明書きを追加することで、バイナリデータをEメールに添付した本文が完成です。
base64_encodeを使ったEメール送信の例
次に、これまで説明したbase64エンコードの機能を使い、バイナリファイルをEメールに添付するPHPプログラムの例を紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
添付ファイルを含むEメール本文を作るPHPプログラムの例 $body = <<<EOF --__BOUNDARYBOUNDARYBOUNDARY__ Content-Type: application/octet-stream; name="fax.pdf" Content-Disposition: attachment; filename="fax.pdf" Content-Transfer-Encoding: base64 EOF; $body .= chunk_split(base64_encode($filebody)); $body .= "--__BOUNDARYBOUNDARYBOUNDARY__--\n" mail( $to, $subject, $body, 'Content-Type: multipart/mixed;boundary="__BOUNDARYBOUNDARYBOUNDARY__"' ); |
上の例は、これまで説明したバイナリデータの説明書きと、エンコード済みのデータを添付する方法を使い、バイナリファイルを添付したEメールの本文を作り、mail関数で送信する例です。
なお、この例では、mail関数の4つめの引数のヘッダ情報で、添付ファイルを含むことを追加しています。
まとめ
これまで説明したように、base64は、PHPでEメールにファイルを添付するプログラムを作る際に用いるエンコード方式です。そして、その際に使用するbase64_encode関数の使い方は簡単ですが、なぜこの関数が必要なのかが解らないと使いこなせません。
とはいえ、PHPのプログラムで、base64_encode関数とmail関数を同時に使う機会は、ほとんどないかもしれません。しかし、base64はmailでは必須の機能です。いつ使うことになるか解りません。この記事を見た機会に、ぜひ、その使い方を覚えておいてください。