2011.11.22
ST

phpでのメール送信=>ヘッダが変なメールをたまに見かけます

phpでよくメールが送られてくるのですが、気になることがあります。
ヘッダー上で本文は「quoted-printable」といいながら、実際の本文は
JISコードで送られてきていることがあるのです。
メーラで見えればいいという考えですとこれでいいのですけれど、少しこだわってみましょう
(pearライブラリのMailとMail/mimeを使っているケースで書いています。)

サイトの説明などで、大抵の本文のエンコード設定は以下のような例文

$body_encode = array(
    "head_charset" => "ISO-2022-JP",
    "text_charset" => "ISO-2022-JP"
);
$body = $mime->get($body_encode);

ぐらいの説明で終わっていたりします

これですと、メールは確かにJISコードに変換されるのですが、実は quoted-printable
で送ることになります。

テストとして以下のようなスクリプトで、本文「漢字」として送った場合

Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: quoted-printable

なのに 中身はHEXダンプすると
00000000 1b 24 42 34 41 3b 7a 1b 28 42
ということでJISコードで送ってしまってます
quoted-printableで送っている場合のHEXダンプでは
00000000 3d 31 42 3d 32 34 42 34 41 3d 33 42 7a 3d 31 42
となり、デコード前の表示では=1B=24B4A=3Bz=1B=28Bといった本文になるのが正しい
ということになり、

Content-Transfer-Encoding: quoted-printable
がおかしいということです

本来は
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit
であるべきで、これの指定は

$body_encode = array(
    "head_charset" => "ISO-2022-JP",
    "text_charset" => "ISO-2022-JP",
    "text_encoding"=>"7bit"
);

と、”text_encoding”=>”7bit”をつけることで、ヘッダ情報とエンコーディング方法
が一致することになります。
以上を踏まえたサンプルのメールスクリプトです
送信者 senduser@example.jp から user@example.jpへ
送るという形です(一部手抜き)


<?php require_once('Mail.php'); require_once('Mail/mime.php'); // // 内部コードはUTF-8で記述しています // // 題名 $subject="テスト"; // 本文 $text =<<<MAIL 漢字 MAIL; // // エンコード処理 $subject = mb_convert_encoding( $subject, "ISO-2022-JP", "UTF-8" ); $subject = mb_encode_mimeheader( $subject, "ISO-2022-JP" ); $from=mb_encode_mimeheader(mb_convert_encoding( '送信者' , "ISO-2022-JP", "UTF-8" ),'ISO-2022-JP') . ' <senduser@example.jp>'; $text = mb_convert_encoding( $text, "ISO-2022-JP", "UTF-8" ); // 現在の改行コード $crlf = "\n"; // ヘッダー情報 $hdrs = array( 'From' => $from, 'Subject' => $subject, ); $mime = & new Mail_mime($crlf); // インスタンス生成 $mime->setTXTBody($text); // BODY // MIME用パラメータ $build_param = array( "head_charset" => "ISO-2022-JP", "text_charset" => "ISO-2022-JP", "text_encoding" => "7bit" ); $body = $mime->get( $build_param ); $hdrs = $mime->headers($hdrs); $mail =& Mail::factory('mail'); $mail->send('user@example.jp', $hdrs, $body); ?>

ST

一覧に戻る