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