network.mail.Mail->send バグ(か微妙?)

どんなバグか?

Subjectを空文字列で、とある携帯にメール送信すると、Subjectに "=?ISO-2022-JP?B??=" が表示される。
一見「携帯のバグじゃん。ちゃんとMIMEデコードしろよな。」と思ったのですが、一概にそうとも言い切れない感触。

<?php
require_once('rhaco/Rhaco.php');
Rhaco::import('network.mail.Mail');
:
$mail = new Mail($from);
$mail->to($to);
$mail->subject(''); // ここで空文字列を設定する。
$mail->message($message);
$mail->send();
?>

まず、Subjectが空文字列のとき、Subjectヘッダが空("Subject: ")なるものが存在しうるか?

次のを見る限りでは、は必須っぽく見える。
http://jbpe.tripod.com/rfcj/rfc-561.j.sjis.txt

<subjectitem> ::= SUBJECT: <SP> <line>
<line>        ::= CRとLFを除いた
                  128 ASCII文字からなる文字列

しかし、次のを見る限りでは、textが0個でもよいらしい。
http://www.spencernetwork.org/reference/rfc822-ja.txt

     optional-field =
                 /  "Message-ID"        ":"   msg-id
                 /  "Resent-Message-ID" ":"   msg-id
                 /  "In-Reply-To"       ":"  *(phrase / msg-id)
                 /  "References"        ":"  *(phrase / msg-id)
                 /  "Keywords"          ":"  #phrase
                 /  "Subject"           ":"  *text

んー。。。
「Subjectが空文字列のヘッダの存在の是非」を問う前の話として、「Subjectをヘッダーに含めない」というのが正解なのかも。ようは「無いんだから付けない」が正解のような気もする。でも、Subjectは必須として見ている人はたくさんいそうだから、Subjectが無いヘッダーを作ってしまうと、別なトラブルに巻き込まれそうな気もする。

ということで、これについてはどうすべきかよくわかりません。
引き続き、違う視点から考える。

Subjectが空文字列のとき、MIMEエンコードした空文字列("Subject: =?ISO-2022-JP?B??=")なるものが存在しうるか?

次のを見る限りでは、空文字列のMIMEエンコードなるものは存在しないように見えます。

http://www.darts.jp/reference/rfc/rfc2047-jp.txt

    encoded-word = "=?" charset "?" encoding "?" encoded-text "?="
    encoded-text = 1*<"?" を除いたどのような印刷可能な ASCII 文字
                      または SPACE>

これを正とするなら、携帯の実装が正しいことになります。

Subjectが空文字列のとき、MIMEエンコードしない。という修正をやってみる。

ここでは「携帯の実装が正しい」。つまり「空文字列のMIMEエンコードというものはあり得ない」という立場で改修してみます。さらに以下のときMIMEエンコードしないように修正します。

  • 空文字列のとき。
  • ASCIIの印刷可能文字のみで構成されるとき。(ついでにこれも)

rhaco/network/mail/Main.php(rev3241/3244)

    /**
     * エンコード済みSubjectを取得する。
     *
     * @return string
     */
    function _subject(){
//          return $this->_toJis($this->subject);
return (preg_match("/^[\x20-\x7e]*$/",$this->subject) ? $this->subject : $this->_toJis($this->subject));
    }

参考

メールと日本語

    • -

2008-07-05追記
以下でfix
http://fixdap.com/p/rhaco/14405/