あおきです。

  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/