External Objectを使わないBridgeMailer

最終更新日

Comments: 0

ごまかしでしかないのですが、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

ten_a

Graphic Designer, Scripter and Coder. Adobe Community Professional.

シェアする

コメントを残す