No タイトル ステータス 重要度 担当 完了予定日 更新日時 記事数
120 [相談]network.mail.Mailのmessageの改行コードを他と同様にコンストラスタでセットしたeolに管理させたい 未着手 未定 2008-09-20 11:05 2008-09-19 14:48 1
※2箇所で利用してるプロパティなので、自分の中で整理できてないです。
 まずは相談という事で、お願いします。

network.mail.Mailのmessageの改行コードを、他と同様にコンストラスタでセットしたeolに管理させたいです。

Mailが内部で生成するメールソースで、Mail->message()でセットするbody部だけが、唯一改行コードが他の部分と扱いが違っています。
Mailではコンストラスタでのフラグで、CRLFかLFかを選択できますが、Mail->message()の場合は引数で渡したままの改行コードが、最後まで維持されます。

これは最終的にMail->send()内でcallしてる組み込みのmail()の仕様の為だと思いますが、network.mail.SMTPからMailインスタンスを利用する場合に、トラブルになる場合があります。
つまり、Mail->message()の改行コードに対して、Mail->send()はLF、SMTP->mail()はCRLFを、求めています。

また、これとは別に文字コードが絡む不安要素がいくつかあります。
・組み込みmail()のbody部を受け取る引数は、マニュアルではLFを必要としますが、実際のところCRLFでも問題ないようです。
※yabekenさんがcoreserverで試した限り。

・組み込みmail()の第4引数(additional headers)は、原則CRLFですが、マニュアルによると場合によってはLFにする必要があるとの事。
 LinuxのMTAの一部が、無条件にLFをCRLRに置換し、CRCRLRになってしまうようです。
※webで検索する限り、postfixとsendmail。修正済みなのか、最新バージョンでもこの動作をするのか、分かりません。

色々と分からない点はありますが、組み込みmail()の第3引数がCRLFでも動作するらしいので、改行コードの変換をしてみました。
組み込みmail()の第3引数は、マニュアルに従うなら、Mail->send()内で改めてCRLFをLF化すればいいんじゃないかと思ったりしています。

Index: Mail.php
===================================================================
--- Mail.php (revision 876)
+++ Mail.php (working copy)
@@ -372,6 +372,35 @@
* @param string $value
*/
function _lw($value=""){
+ /***
+ * $r = "\r";
+ * $n = "\n";
+ * $f = new File(Rhaco::constant('CONTEXT_PATH').'/__settings__.php');
+ * $b = base64_encode($f->read());
+ * $bCR = trim(chunk_split($b,76,$r));
+ * $bLF = trim(chunk_split($b,76,$n));
+ * $bCRLF = trim(chunk_split($b,76,"{$r}{$n}"));
+ * $ar = array(new Mail(), new Mail('','',true));
+ * foreach($ar as $mail){
+ * $e = $mail->eol;
+ * eq($e,$mail->_lw());
+ * eq("example{$e}",$mail->_lw('example'));
+ * eq("This{$e}is{$e}a{$e}example{$e}",$mail->_lw("This{$n}is{$n}a{$n}example"));
+ * eq("This{$e}is{$e}a{$e}example{$e}",$mail->_lw("This{$r}{$n}is{$r}a{$n}example"));
+ * eq("<html>{$e}<body>{$e}</body>{$e}</html>{$e}",$mail->_lw("<html>{$n}<body>{$r}</body>{$r}{$n}</html>"));
+ * $be = trim(chunk_split($b,76,$mail->eol));
+ * eq("$be{$e}",$mail->_lw($be));
+ * eq("$be{$e}",$mail->_lw($bCR));
+ * eq("$be{$e}",$mail->_lw($bLF));
+ * eq("$be{$e}",$mail->_lw($bCRLF));
+ * }
+ */
+ if(strpos($value,"\n") !== false || strpos($value, "\r") !== false){
+ $ptnCRLF = '/\r\n/';
+ $ptnLF = '/(?<!\r)\n/';
+ $ptnCR = '/\r(?!\n)/';
+ $value = $this->eol === "\r\n" ? preg_replace(array($ptnLF, $ptnCR), $this->eol, $value) : preg_replace(array($ptnCRLF, $ptnCR), $this->eol, $value);
+ }
return $value.$this->eol;
}