VBSと連携するElectronアプリを作る
electronは大変便利なプラットフォームですが、Windows環境で使う場合に於いて、特に企業ユースの場合「あれは駄目、これは駄目」そういったケースが多いと思います。その1つがメール送信。(SMTP駄目やらWeb APIの使用駄目などなど)。
そうすると、メール1つ送るにしても、electronからはこのままでは送る事ができません。しかし、ほとんどの企業で穴になっている「VBA」や「VBS」については使える事が多いので、これを利用してVBScriptにそれら代理をしてもらう手段を考えました。VBScriptに引数を渡し、指定の条件でOutlookからのメール送信をやってもらうのが今回の目的。
VBScriptが使えると、Windows環境ではoffice製品のコントロールをelectronからも行えるようになるので、活用の幅が広がるのではないかと。
目次 [隠す]
今回使用するプロジェクトファイル
※今回はjQuery以外に特に外部モジュールをnpm installしていません。
※中に入ってるmailer.vbsは、今回はデスクトップに配置してください。
図:こんな感じのウィンドウから作業開始になります。
ソースコード
VBSのみを実行するケース
electron側
レンダラプロセス側
- IPC通信にて、メインプロセスにテキストボックスのメアドを送り込んでいます。
メインプロセス側
- 同期的にコマンドラインを実行する必要があるので(返り値を取得するため)、child_processでは、spawnSyncを利用しています。
- デスクトップに配置したmailer.vbsが今回メールを送信するVBSスクリプトファイルです。
- vbsCommandにはvbsファイルへのパスと、ダイアログから受け取ったメアドを引数で渡しています。
- spawnSyncにてコマンドライン実行。cscript.exeがvbscriptの実行本体。コマンドライン引数にfullpathとaddressをつなげています。
- vbsファイルからの返り値は、child.statusとして取得しています。
VBS側(mailer.vbs)
- 無事に送信されると、electron側に0のstatusが返る
- Outlookが起動していなくとも、APIで実行されているのでメールはデフォルトアカウントで送信されます。
- 冒頭のargsにて、引数として指定されてるメアドを取得しています。
- 今回は、Microsoft365のOutlook Version 16.0でテストしています。
- メールが送れるので、APIなしでOutlookを使って、Microsoft Teamsのチームチャンネルに投稿が可能です。
- Teams投稿時にはVBSファイルは文字コードがANSIでないとSubjectが文字化けします。メモ帳で保存時に文字コードをUTF-8からANSIに変更して保存しましょう。
VBAを実行させるケース
VBSを介してVBAを実行させる事が可能です。また、その場合に引数を渡し、返り値を受け取る事が可能ですが、VBAからの結果出力はShift-JISでありそのままだと文字化けしてしまいます。そこでこれをiconv-liteを使って変換する事で、Electron側で受け取る事が可能です。事前にnpmで追加しておきましょう。
electron側
- nologoオプションを指定しています。stdoutから結果にロゴが入ってしまうのを除外する為です。
- 実行するVBAの入ったファイルは、argsにて指定していますが、このargsにはxlsmファイルへのフルパスと引数をカンマ区切りにした値が格納されています。
- 返り値はテキストで帰ってくるのでchild.stdoutにて出力を受け取ります。
- Buffer.fromでchild.stdoutを引き受けます
- 受け取った出力はShift-JIS形式なので、iconv.decodeにてNode.jsで扱えるUTF-8に変換してretに格納しています。
VBS側
- 単純にVBA側に文字列を渡して返り値を受け取って表示するだけ。
- VBA側のModule1の中にあるtestmanという関数を実行しています。引数としてstrMsgを渡しています。相手方はVariant型で受け取る必要があります。
VBA側
- 単純に引数に文字を足して返すだけの関数です
- 引数も返り値もVariant型で指定します。
関連リンク
- Node.jsからコマンドを別プロセスとして実行
- OutlookとVBScriptによるメール自動送信
- Outlook を使ってメールを送信する
- エラー一覧とエラー処理のサンプルコード
- 決まった時間に添付ファイル付きのメールを自動送信するためのスクリプト
- 別のVBScriptファイルを実行して戻り値を受け取る方法
- BATファイルからVBScriptを呼び出して、結果コードを受け取るには
- Run .vbs script with node
- Executing a script as a child_process.exec inside an asar archive #3512
- Microsoft Teamsのチャネルにメールでメッセージを投稿できることをご存知ですか?
- JavaScriptで文字コード変換(Uint8Arrayや、Bufferってなに?)