June 26, 2008
Quoted-Printable Encode/Decode
phpにquoted_printable_decode()関数はあるけど、quoted_printable_encode()関数はないので、エンコードは次のように行う(mb拡張があればmb_encode_mimeheader()でQエンコーディング使えば良い)。
変換したりしなかったりなので、ヘッダでもボディでも、とにかくアンダースコアは=5Fに変換しておけば良い。
$fp = fopen("php://temp", "r+");
stream_filter_appand($fp, "convert.quoted-printable-encode",
STREAM_FILTER_READ,
array("line-length" => 74,
"line-break-chars" => "\r\n")
);
fputs($fp, $str);
rewind($fp);
$encoded = stream_get_contents($fp);
fclose($fp);
多くのMUAがヘッダに含まれるアンダースコアをスペースに変換する(ボディのアンダースコアはそのまま)。変換するMUAは、確認したところで、Outlook Express6, Thunderbird, Mail, Becky, Sylpheed, Eudora, Entourage。変換しないMUAはShuriken。変換したりしなかったりなので、ヘッダでもボディでも、とにかくアンダースコアは=5Fに変換しておけば良い。
$encoded = str_replace("_", "=5F", $encoded);
デコード時は、先程挙げた多くのMUAと同様、ヘッダの場合にのみアンダースコアをスペースに変換する。=5Fはquoted_printable_decode()関数がアンダースコアに変換するので、気にしなくて良い。
if ($isHeader) {
$str = str_replace("_", " ", $str);
}
$decoded = quoted_printable_decode($str);