時々話題になっていた遅延フォルダ選択の問題を。これは、たとえばフォルダビューでフォルダをキーボードで選択した直後にフォルダのプロパティを表示させると、前に選択していたフォルダのプロパティが開いてしまうというような問題です。
代々、フォルダビューのツリービューのイベントを受け取ったときにタイマをかまして遅延させていたのですが、このタイミングでは遅延させず、フォルダモデルを更新し、そのフォルダモデルからイベントを受け取った側で遅延させることにしました。
COMインターフェイスからメッセージのコンテンツをそのままバイト列で返すプロパティを公開したものの、FileSystemObjectはバイナリはサポートしていなくて使い道がないなぁと思っていたのですが、BASP21というコンポーネントを使うととりあえずファイルに出力するのは出来ました。
set account = document.accounts("test") set folder = account.folders("Inbox") set mh = folder.messages(0) set message = mh.message content = message.content set basp = CreateObject("basp21") basp.BinaryWrite content, "d:\temp\test.msg"
ちなみにバイナリは、VT_UI1のSAFEARRAYを作ってデータをコピーして、VARIANTにVT_UI1|VT_ARRAYでセットしておくとちゃんと扱えるみたいです。SAFEARRAYを直接だとどうも上手く受け渡しが出来ないみたいなのですが、Dispatch互換型でバイナリを扱うときの作法なんでしょうね。
メッセージの本文中に埋め込まれているUuencodeをデコードしたいという要望を以前から頂いていて、本体でサポートするのはあんまり美しくないなぁと思っていたのですが、スクリプト側でサポートするというのはどうだろうと思っています。
バイナリファイルはこれを使っても出来るようです。ADOが入っていないとダメですが。今度はJScriptで。
var account = document.accounts("test"); var folder = account.folders("Inbox"); var mh = folder.messages(3); var message = mh.message; var content = message.content; var stream = new ActiveXObject("ADODB.Stream"); stream.Open(); stream.Type = 1/*adTypeBinary*/; stream.Write(content); stream.SaveToFile("d:\\temp\\test.msg", 2/*adSaveCreateOverWrite*/);
ちなみに、SaveToFileの二番目の引数には、ビット和が渡せるとドキュメントには書いてありますが、3を渡すとエラーになります。