パーフェクトPHP (PERFECT SERIES 3)
のメール送信の部分14.3.1(p530)を読んだ。そのさいに調べたメモ。
メールの送信はmail関数使う。
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )
メールの文字コードは7bit文字のISO-2022-JP[1](半角カナを使う場合はJIS)。
タイトルはRFC2045を満たす形式。マルチバイト文字の場合はBase64で符号化する。
$subject = 'これは日本語メールです'; $enc_subject = mb_encode_mimeheader($subject, 'ISO-2022-JP'); // p532
mb_encode_mimeheader($subject, ‘ISO-2022-JP’)は$subjectをISO-2022-JPのBase64でエンコードしRFC2045を満たす形式に変換する。
タイトルが「あ」一文字のメールの処理イメージ。
上記メールのGmailのタイトル部分のソース
Subject: =?ISO-2022-JP?B?GyRCJCIbKEI=?=
符号化の処理のイメージ
$utf8 = 'あ'; // UTF-8からISO-2022-JPへ変換 $iso_2022_jp = mb_convert_encoding($utf8, 'ISO-2022-JP'); // $B$"(B // ISO-2022-JPの「あ」『$B$"(B』をbase64でエンコード $base64 = base64_encode($iso_2022_jp); echo $base64, PHP_EOL; // GyRCJCIbKEI=
» http://www.darts.jp/reference/rfc/rfc2045-jp.txt
» http://www.darts.jp/reference/rfc/rfc2047-jp.txt
$message = 'こんにちは'; $enc_message = mb_convert_encoding($message, 'ISO-2022-JP'); // p532
$header_array = array( 'Mime-Version: 1.0', 'Content-Type: text/plain; charset=ISO-2022-JP', 'Content-Transfer-Encoding: 7bit', ); $headers = implode("\r\n", $header_array); // p532
7bit文字ISO-2022-JPはBase64で符号化しなくても良い。そのためmb_convert_encodingでISO-2022-JPへ変換した本文をそのままmail関数に渡している。
メールにかけられた呪文「MIME~後編」がとても分かり易かった。以下引用。
Content-Typeでは、コードがISO-2022-JPであることをcharsetによって示している。Content-Transfer-Encodingは、ISO-2022-JPが7ビットコードなので、当然7ビットである。ただし、この記述は省略してもよい(Content-Transfer-Encodingのデフォルト値が7ビットのため)。これで通常のテキストメールが完成する。 多くの場合は、以上の方法で問題ない。しかし、シフトJISやほかのコードで表現したい場合もあるだろう。例えば、半角カナや機種依存コード(丸付き数字や単位記号など)を含んでいるため、ISO-2022-JPに変換できない場合や、正確に送信する必要のある原稿などを添付ファイルにする場合だ。 こうした場合は、以下のように格納されることがある。 (中略) MIME-Version: 1.0 Content-Type: text/plain; charset="SJIS" Content-Transfer-Encoding: base64 (中略) (中略) MIME-Version: 1.0 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 (中略) つまり、テキストファイルをバイナリファイルのように添付ファイルとして扱うのである。つまり、テキストファイルをMIME化すればよい(この方法は複数ある)。
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。