パスワード別送メールのzipを自動で解凍したい #2

VBA

おはようございます、タナイです。
今日は前回に引き続きパスワード別送zipの自動解凍について書いていきます。

さて、前回抽出したプログラムのフローに沿って考えていきましょう。今回は#2まで。

  1. メール受信時のイベントプロシージャとして記述する
  2. 受信したメールのIDを取得する
  3. パスワード別送の送信元かを判定する
  4. 添付ファイルが含まれているかを判定する
  5. zipファイルであるのかを判定する
  6. メールを含むフォルダを取得する
  7. パスワードメールを特定する
  8. パスワードメールの本文からパスワードを抽出する
  9. 7-zipをコマンドラインで起動してzipをテンポラリに解凍する
  10. 解凍されたファイルを元のメールの添付ファイルとして追加する
  11. 解凍されたファイルをテンポラリから削除する
  12. (必要なら)処理完了のメッセージボックスを表示する

そもそもOutlookでマクロ使えるの?

Excelのマクロというと聞いたことがある人も多いと思いますが、実はOutlookやWordなどOfficeアプリは全部マクロ(VBA)に対応しています。

ちなみに、マクロとVBAの違いについて簡単にまとめると以下のようになります。

  • マクロ 一連のコンピュータ操作を自動化する機能の総称
  • VBA  Officeソフトで使うマクロを記述するプログラミング言語

マクロは一般的な用語で、VBAはOfficeでの中身のプログラミング言語を指す感じです。今回は、VBAで自動化のプログラムを作っていくということになります。

とりあえずOutlookの画面をアクティブにした状態でAltF11を押すとVBAを書くためのエディタ(VBE)が起動します。

画面左側のコラムには以下のようなツリーが表示されると思います。

VBEの起動画面

実際のプログラム文はThisOutlookSessionをダブルクリックした先に記述していくことになります。

イベントプロシージャとは

さて、実際にプログラムを書くにあたって、今回はイベントプロシージャというのを利用します。

イベントプロシージャとは、ソフトウェア上で何らかの動作があったときに合わせて自動で起動されるプログラムです。

そのほかにも通常のSubプロシージャやFunctionプロシージャなどがありますが、それらVBAの入門については別記事にしたためます。

VBA初心者シリーズ🔰の第1回です

今回は、メールを受信したときに起動させたいのでApplication_NewMailExイベントを利用することになります。

受信時にEntryIDを取得できる

では実際の記述に入っていきましょう。

イベントプロシージャを先ほどのThisOutlookSessionに入力していきます。

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
Dim myMail As MailItem
Set myMail = GetNamespace("MAPI").GetItemFromID(EntryIDCollection)
MsgBox "Procedure is successfully called."
End Sub

これは、メールの受信時に”Procedure is successfully called.“というメッセージをポップアップさせるだけの動作です。まずは、メール受信時に何かを動作させるという機能を確認している感じですね。

一気に書き上げるのではなくて、指示内容ごとに想定通りの動きが実現できているかを細かくチェックすることが体系的な理解につながります。

さて、上記のプロシージャには引数EntryIDCollectionが渡されていますが、 Application_NewMailExイベントでは、受信時にそのメールのEntryID(プログラム内での固有の識別子)を引数として受け取ることが出来ます

どうもこのEntryIDまわりの引数渡し動作はOutlook2010あたりを境に仕様が変更されているようなので、詳しくは以下のリンクをご参照ください(外部サイト)。

Outlookのオブジェクト構成で覚えるべきなのは2つ

ExcelのVBAだとグラフやセルが扱う主体なので、ChartObjectまわりやRangeまわりの構成を覚えることになりますが、Outlookの場合はフォルダやメールなどのアイテムが主な取り扱い先になります。

ここでやっかいなのが、メールなどの各アイテムを閲覧ウィンドウで見ているのか個別のウィンドウ(ダブルクリックして開いた状態)で見ているのかで取得の仕方が異なる点です。

結論から言うと以下の2種類の系統があります。

  • Namespace MAPI :フォルダを辿ってアクセス
  • Inspector:開いているアイテムの中からアクセス

たとえば特定のメールを開いていてそのメールについて処理したいのであれば、

Dim myItem as MailItem
Set myItem = ActiveInspector.CurrentItem

フォルダから辿っていきたいのであれば、先ほどの紹介の通り、

Dim myItem as MailItem
Set myItem = Application.GetNamespace("MAPI").GetItemFromID(EntryIDCollection)

以上のような形になるわけです。EntryIDはOutlook内で取り扱われる各アイテムで固有に割り振られていますので、一旦取得してしまえば使い回せます。

まとめ

今日は、メールを受信したタイミングでOutlook VBAを動作させる方法についてまとめました。

また、合わせて受信したメールの特定方法とOutlook VBAのオブジェクト構成についても述べました。

次回以降で実際に動作させる内容について解説していきたいと思います。

コメント

  1. […] おはようございます、タナイです。今日も前回に引き続き第3回を書いていきます。 […]

タイトルとURLをコピーしました