hidao’s blog

IT系とか読書ログとか。

Outlook へのメール着信を VBA を使って Chatwork に投稿して通知する

先日、Outlook に着信したメールの件名に応じて Chatwork に自動で投稿して通知する仕組みを作りましたのでシェアします。

しくみ

Outlook VBA には新着メールを検出したときに実行されるサブプロシージャ「Application_NewMailEx」が用意されていますので、それを利用します。

妥協点として、Chatwork へ投稿をする Outlook は起動しっぱなしにする必要があるので、Windows PC + Outlook を適切なユーザでログインし起動したままにしておかないといけないという弱点があります。

今回の処理の流れ

  1. OutlookVBA を記述し、Application_NewMailExが実行されたタイミングでメールの内容を読み取れるようにしておく
  2. 着信したメールを読み取り、特定の件名(「【お問い合わせ】」が件名に含まれるなど)ときに Chatwork にメッセージを送信するように制御する
  3. メールの本文から投稿者名や問い合わせ内容を抽出する
  4. Chatwork への投稿用データを作成する。このとき、HTTP リクエスト文字列は Shift_JIS で、Chatwork に表示される文字列は UTF-8 にしておかないと Chatwork に正しく表示されないので VBA では Shift_JIS の ADODB.Stream に UTF-8 のバイト配列を埋め込む形にする必要がある
  5. HTTP リクエストとして必要なヘッダや Chatwork の API トークンを付与し、4. で作成したバイト配列をリクエストボディとして Chatwork API のエンドポイントに送信する

今回の肝

Outlook VBA による Chatwork への投稿用データは HTTP リクエスト文字列(半角英数・記号な部分)および添付ファイル(画像や PDF など)は Shift_JIS エンコードのストリームにする必要があります。

また、Chatwork の本文として表示される文字列は UTF-8 にしておかないと文字化けしたりして正しく表示されません。
日本語を投稿したい場合、Outlook VBA においては Shift_JIS の ADODB.Stream に UTF-8 の文字列から先頭の BOM を取り除いた上でバイト配列に変換し、Shift_JIS のストリームに追記していく必要があります。

この辺のことは Outlook VBA と Chatwork API の相性みたいなもののようらしくものすごく特殊な例で、公式ドキュメントや技術記事はなさそうだったで試行錯誤でなんとか解明しました。

ソースコード

詳細はソースコード内のコメントをご覧ください。(コメント書いたら力尽きた)

今回のソースコードの添付ファイルはプレーンテキストですが、同じような要領でネット FAX に添付ファイルとして送られてくる画像を添付ファイルとして Chatwork に添付して送信することも可能です。
可能性はアナタ次第!(謎キャラ