2012年04月01日

JSで自動メール印刷

自動で指定メアドからメールを受信し、
メールの内容を印刷するJScriptをがんばってみる

必要な環境は、IE,BASP21
IEは印刷のために使用
Excelでやり始めたのですが、画像をスケーラブルに印刷(サイズ,画像数可変)させる
方法が分からなかっただけです

main_print_mail.js
マズはメインのスクリプト
サブディレクトリにMailディレクトリを作成して、
メールを受信します
受信したメールファイルから内容を取得して印刷関数へ渡します
eval( GetAllTextFile("Log.js") );
eval( GetAllTextFile("PrintMail.js") );

//-------------------------------------------------------------------
function GetAllTextFile( js_path )
{
  var obj_fs = WScript.CreateObject("Scripting.FileSystemObject");
  try {
    var fs_txt = obj_fs.OpenTextFile( js_path, 1);
    try {
      return fs_txt.ReadAll();
    }
    finally {
      fs_txt.Close();
    }
  }
  finally {
    delete obj_fs;
  }
}

WScript.Quit( main() );

function main()
{
    var MailSvName   = "MAIL POP3サーバー名";
    var MailUserName = "MAIL ユーザー名";
    var MailUserPass = "a " + "MAIL パスワード";

    var fso  = null;
    var basp = null;
    try {
        var ret = "";

        try {
            fso  = WScript.CreateObject("Scripting.FileSystemObject");
            basp = WScript.CreateObject("basp21");

            var mail_dir = fso.GetParentFolderName(WScript.ScriptFullName) + "\\Mail";
        
            if( fso.FolderExists( mail_dir ) == false ) {
                fso.CreateFolder( mail_dir );
            }
        
            var ret_array = basp.RcvMail(MailSvName, MailUserName, MailUserPass, "SAVEALL", "<" + mail_dir);
            if( ret_array.length <= 0 ) {
                return 0;
            }
            var out_mail = ret_array.toArray();

            for ( var i in out_mail ) {
                //WScript.Echo( out_mail[i] );
                var attatch_dir = out_mail[i] + "_att";
        
                if( fso.FolderExists( attatch_dir ) == false ) {
                    fso.CreateFolder( attatch_dir );
                }
                var out_data = basp.ReadMail( out_mail[i], "subject:from:date:", attatch_dir ).toArray();
                var str_from    = "";
                var str_to      = "";
                var str_date    = "";
                var str_subject = "";
                var str_body    = "";
                var str_attrs   = new Array();

                for ( var j=0; j<out_data.length; j++ ) {
                    var key = out_data[j].split(" ", 2)[0];
                    var val = out_data[j].substring( key.length+1, out_data[j].length );

                    if( key.match(/From\:/i) ) {
                        str_from = val;
                    }
                    else if( key.match(/To\:/i) ) {
                        str_to = val;
                    }
                    else if( key.match(/Date\:/i) ) {
                        str_date = val;
                    }
                    else if( key.match(/Subject\:/i) ) {
                        str_subject = val;
                    }
                    else if( key.match(/Body\:/i) ) {
                        str_body = val;
                    }
                    else if( key.match(/File\:/i) ) {
                        var cnt = str_attrs.length;
                        str_attrs[cnt] = val;
                    }
                }

                ret = PrintMail( str_subject, str_from, str_to, str_date, str_body, str_attrs );
                if( ret != "" ) {
                    LogOut( "Error", ret );
                }
            }
        
        }
        finally {
          delete basp;
          delete fso;
        }
    }
    catch( e ) {
        LogOut( "Error", e );
        return 255;
    }

    return 0;
}
PrintMail.js
次に印刷本体です
渡されてきた内容をHTMLとして保存して
魔法のパラメータ?ExecWB( 6, 2)で印刷させています
eval( GetAllTextFile("Log.js") );

//-------------------------------------------------------------------
function GetAllTextFile( js_path )
{
  var obj_fs = WScript.CreateObject("Scripting.FileSystemObject");
  try {
    var fs_txt = obj_fs.OpenTextFile( js_path, 1);
    try {
      return fs_txt.ReadAll();
    }
    finally {
      fs_txt.Close();
    }
  }
  finally {
    delete obj_fs;
  }
}
//-------------------------------------------------------------------
function EscapeHtmlString( str )
{
  str = str.replace("&","&amp;");
  str = str.replace("<","&lt;");
  str = str.replace(">","&gt;");
  return str;
}

//-----------------------------------------------------------------------------
//! メール印刷
/*! 
    @param[in] str_subject subject
    @param[in] str_from    from
    @param[in] str_to      to
    @param[in] str_date    date
    @param[in] str_body    body
    @param[in] str_attrs   添付ファイル名配列(絶対パス)
    @return エラーメッセージ(空時は成功)
*/
function PrintMail( str_subject, str_from, str_to, str_date, str_body, str_attrs )
{
    var TempHtml = "temp.html";
    var fso   = null;
    var ie    = null;
    try {
      fso  = WScript.CreateObject("Scripting.FileSystemObject");
      ie = WScript.CreateObject("InternetExplorer.Application");
      ie.Visible       = false;
      //ie.Visible       = true;

      var temp_html = fso.GetParentFolderName(WScript.ScriptFullName) + "\\" + TempHtml;

      if( fso.FileExists( temp_html ) == true ) {
          fso.DeleteFile( temp_html );
      }

      var body = "";
      body += "Subject:" + EscapeHtmlString(str_subject) + "<br />\r\n";
      body += "From:"    + EscapeHtmlString(str_from)    + "<br />\r\n";
      body += "To:"      + EscapeHtmlString(str_to)    + "<br />\r\n";
      body += "Date:"    + EscapeHtmlString(str_date)    + "<br />\r\n";
      body += "<pre>"    + EscapeHtmlString(str_body)    + "</pre>\r\n";

      // 添付ファイル操作
      for ( var i=0; i<str_attrs.length; i++ ) {
        var fname = fso.GetFileName( str_attrs[i] );
        body +=  "<p>\r\n";
        // 添付ファイル名と、アンカーを付ける
        body +=  "<a href=\"" + str_attrs[i] + "\" target=\"_blank\">[" + fname + "]</a><br />\r\n";
        // 画像ファイルはイメージを表示する
        if( fname.match(/.*\.jpg$/i) ) {
          body += "<img src=\"" + str_attrs[i] + "\" alt=\"jpeg\" /><br />\r\n";
        }
        if( fname.match(/.*\.jpeg$/i) ) {
          body += "<img src=\"" + str_attrs[i] + "\" alt=\"jpeg\" /><br />\r\n";
        }
        if( fname.match(/.*\.png$/i) ) {
          body += "<img src=\"" + str_attrs[i] + "\" alt=\"png\" /><br />\r\n";
        }
        if( fname.match(/.*\.gif$/i) ) {
          body += "<img src=\"" + str_attrs[i] + "\" alt=\"gif\" /><br />\r\n";
        }
        body +=  "</p>\r\n";
      }

      var tfo  = null;
      try {
        tfo = fso.OpenTextFile(temp_html, 2, true);
        tfo.WriteLine("<html>");
        tfo.WriteLine("<head>");
        tfo.WriteLine("<title>" + EscapeHtmlString(str_subject) + "</title>");
        tfo.WriteLine("</head>");
        tfo.WriteLine("<body>");
        tfo.WriteLine( body );
        tfo.WriteLine("</body>");
        tfo.WriteLine("</html>");
      }
      finally {
        if( tfo != null ) tfo.Close();
        delete tfo;
      }

      // ページロード
      ie.Navigate( temp_html );
      if( IeBusyWait( ie, 60 ) == false ) {
        throw "ie.Navigate() TimeOut(" + TempHtml + ")";
      }
      
      //WScript.Echo("page created");

      // 印刷
      ie.ExecWB( 6, 2 );
      if( IeBusyWait( ie, 60 ) == false ) {
        throw "ie.ExecWB() == false";
      }

       // ビジーウェイトでダメみたいなので
       WScript.Sleep(60*1000);
    }
    finally {
      delete fso;
      if( ie != null ) ie.Quit();
      delete ie;
    }

    return "";
}

function IeBusyWait( ie, timeout )
{
  var ret = false;
  for( var i=0; i<timeout; i++ ) {
    WScript.Sleep(1*1000);
    if( (ie.busy == true ) || ( ie.Document.readyState != "complete") ) {
    }
    else {
      ret = true;
      break;
    }
  }

  return ret;
}
上記スクリプトには1点未解決の問題があります
ExecWB( 6, 2 )実行後に印刷データがスプールされるまでIEを終了させてはいけないようです
(終了させるとスプールされないので印刷しない)
スプールしたかどうかをチェックする方法が分かりませんでしたので適当にウェイトさせています
んー、どうすれば、、、

Log.js
これは共通のログ出力用関数
タスクスケジューラで動作させるため、イベントログへ記録するようにしています
//-----------------------------------------------------------------------------
//! ログ出力
/*! 
    @param[in] log_level log level "Debug" or "Info" or "Error"
    @param[in] str       log message
*/
function LogOut( log_level, str )
{
    //var OutLogType  = "Echo"; // Echoダイアログを出す
    var OutLogType  = "EventLog";   // イベントログに出力する
    //var OutLogLevel = "Info,Error,Debug";   // 出力するlog_level
    var OutLogLevel = "Error";   // 出力するlog_level

    var wsh  = null;
    try {
        wsh  = WScript.CreateObject("WScript.Shell");

        var event_log_type = 0;

        if( (OutLogLevel.indexOf("Debug") >= 0) && (log_level == "Debug") ) {
            event_log_type = 0;
        }
        else if( (OutLogLevel.indexOf("Info") >= 0) && (log_level == "Info") ) {
            event_log_type = 4;
        }
        else if( (OutLogLevel.indexOf("Error") >= 0) && (log_level == "Error") ) {
            event_log_type = 1;
        }
        else {
            return;
        }
        
        if( OutLogType == "Echo" ) {
            WScript.Echo( log_level + ":" + str );
        }
        else if( OutLogType == "EventLog" ) {
            wsh.LogEvent(event_log_type, "[" + WScript.ScriptName + "] " + str);
        }
        else {
            WScript.Echo( msg );
        }

    }
    finally {
      delete wsh;
    }
}
main_print_mail.jsをタスクスケジューラへ突っ込んで
定期実行させます
posted by sanahi at 21:29
"JSで自動メール印刷"へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。