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)); }