あおきです。
In Mail "[ruby-list:15821] Re: maillib with big base64"
kikutani / sprintmail.com wrote:
> On Sun, 1 Aug 1999 22:50:27 +0900,
> kikutani / sprintmail.com wrote:
>
> > maillib を使いはじめましたが、マルチパートで
> > base64エンコードされた長めのデータがあると、
> > 送信でハングするようなんですが、そんなこと
> > (データ依存性)はないですよねえ。
ないはずです。小さくすると送れるということは、たぶんサイズが
原因でしょう。想像するに、行末コードが\rとかになっているのでは?
あるいは、\r\nの環境で\nの場合でも同様です。
そうすると、eachループの一回目で一気に全部読み込まれて、3MBの
文字列にgsub!をかけることになるので、すさまじい負荷がかかります。
次のバージョンではこっそり対策を入れておくかもしれませんが、
やはり一時的にでも3MBのメモリ割りあてが発生するのは好ましいこと
とは言えないので、できるだけクライアント側で対策を講じることが
望ましいと思います。sendmailなど、巨大な文字列を扱う可能性のある
メソッドはどれも引数からeachを介して文字列を受けとることになって
いるので、文字列やIOにラッパーをかぶせてやるのがいいです。
それからついでに書いておくと、POPMail#popなど巨大な文字列を受け取る
可能性のあるメソッドは省略可能な引数として「読み込み先オブジェクト」
を渡せます。読みこまれた文字列は << メソッドによってこのオブジェクト
に渡されるので、たとえば
File.open( '/tmp/save', 'w' ){|f| popmail.pop( f ) }
で直接ファイルに書き込めます。
> smtp.rb に細工してメッセージを出すようにすると
(略)
> ところで、こういうログを取るときの仕様は決まったんでしたっけ?
session.rbにあるNet::DEBUGといういかにもあやしげな定数にtrueを
いれておくと$stderrにコマンドが表示されます。アプリケーション側から
それをうける仕組はまだありません。
これを利用して $stderr -> @stderr とするのでどうでしょう。
-------------------------------------------------------------------
あおきみねろう site: http://www1.u-netsurf.ne.jp/~brew/mine/jp/