PHPメールに関する覚書 : PHP

Pocket

パーフェクトPHP (PERFECT SERIES 3)
のメール送信の部分14.3.1(p530)を読んだ。そのさいに調べたメモ。

メールの送信はmail関数使う。

bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

» PHP: mail – Manual

メールの文字コードは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=?=
  • 全体を=?と?=で囲む。
  • =?, ?=の中は文字コード、符号化方式、符号化された文字列が?で区切られている。
    • 文字コード: ISO-2022-JP
    • 符号化方式: B (Base64)
    • 符号化文字列: 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.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。