External Objectを使わないBridgeMailer
ごまかしでしかないのですが、Windowsでも動作可能なBridgeMailerを用意してみました。問題のBase64エンコーダはJavascriptからストーリーム処理を行なう事で実現しています。ExternalObjectを利用する場合と比べると2桁程スループットが落ちますが、Adobe純正を利用するより2桁程スループットが上がります。
変更したファンクションだけ掲載しておきます。スクリプトのダウンロードが一番下です。
BridgeMailer.encodeString = function(fpath) { //for encode target object
var theFile = new File(fpath);
theFile.encoding = "binary";
theFile.open("r");
var binStr = theFile.read();
theFile.close();
var flNm = fpath+".tmp";
var tmpFile = new File(flNm);
tmpFile.open("w");
szB64 = new Array;
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
for (j=0;j<64;j++){
szB64[j] = keyStr.charAt(j);
}
var ecdStr = "";
var counter = 0;
var binLen = binStr.length - (binStr.length % 3);
for (i=0;i<binLen;i+=3) {
ecdStr += szB64[binStr.charCodeAt (i) >> 2];
ecdStr += szB64[((binStr.charCodeAt (i) & 0x3) << 4) | (binStr.charCodeAt (i+1) >> 4)];
ecdStr += szB64[((binStr.charCodeAt (i+1) & 15) << 2) | (binStr.charCodeAt (i+2) >> 6)];
ecdStr += szB64[binStr.charCodeAt (i+2) & 0x3f];
counter +=4;
if(counter > 75) {
tmpFile.writeln (ecdStr);
ecdStr = "";
counter = 0;
}
}
switch (binStr.length % 3){
case 2:
ecdStr += szB64[binStr.charCodeAt (i) >> 2];
ecdStr += szB64[((binStr.charCodeAt (i) & 0x3) << 4) | (binStr.charCodeAt (i+1) >> 4)];
ecdStr += szB64[((binStr.charCodeAt (i+1) & 15) << 2) | (binStr.charCodeAt (i+2) >> 6)];
ecdStr += "=";
tmpFile.writeln (ecdStr);
break;
case 1:
ecdStr += szB64[binStr.charCodeAt (i) >> 2];
ecdStr += szB64[((binStr.charCodeAt (i) & 0x3) << 4) | (binStr.charCodeAt (i+1) >> 4)];
ecdStr += "=="
tmpFile.writeln (ecdStr);
break;
default:
tmpFile.writeln (ecdStr);
break;
}
tmpFile.seek(0,0);
while(!tmpFile.eof) BridgeMailer.socket.write(tmpFile.readln()+"\r\n");
tmpFile.close();
tmpFile.remove();
}
おおもとのファイルを一気に読み込んでもスループットは落ちないみたいなので、書き出しだけがライン毎の処理になっています。
こちらがスクリプトです。
BridgeMailerNoEO.jsx.zip