Outlook VBAで「怪しいメール」を瞬時に見抜く:セキュリティ自動化の第一歩
こんにちは。業務自動化の世界へようこそ。
普段、何気なく使っているOutlookですが、実は裏側で「メールが届いた」というイベントをフックして、自由自在に操れることをご存知でしょうか?
今回は、ただの振り分けではなく、「パスワード付きZIPファイル」を検知して警告フラグを立てるという、セキュリティ現場の最前線でも通用するロジックを実装してみましょう。「マクロの記録」から一歩踏み出し、オブジェクト指向の真髄に触れる素晴らしい体験になるはずです。
—
1. なぜ「イベントハンドラ」を使うのか?
Outlook VBAには、ボタンを押して動かすマクロだけでなく、「特定の事象(イベント)が発生した瞬間に自動起動する」仕組みがあります。
メールが届いた瞬間に発火する `NewMailEx` イベントを使いましょう。これが自動化の心臓部です。
陥りやすい罠:ループとイベントの干渉
初心者がやりがちなのは、メールが来るたびに重い処理を走らせてOutlookをフリーズさせること。私たちは「解析」と「判断」を最小限のメモリ消費で行う、洗練されたコードを書きます。
—
2. 実装コード:セキュリティ監視の心臓部
以下のコードを、Outlook VBAの `ThisOutlookSession` モジュールにコピーしてください。
‘ ———————————————————
‘ 概要: 受信メールを監視し、パスワード付きZIPを検知してフラグを立てる
‘ ———————————————————
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
Dim objItem As Object
Dim objMail As MailItem
Dim objAttachment As Attachment
‘ EntryIDからメールオブジェクトを特定
Set objItem = Session.GetItemFromID(EntryIDCollection)
‘ メールアイテムか確認(会議出席依頼などを除外)
If TypeOf objItem Is MailItem Then
Set objMail = objItem
‘ 添付ファイルがある場合のみループ開始
If objMail.Attachments.Count > 0 Then
For Each objAttachment In objMail.Attachments
‘ 拡張子が .zip かつ、ファイル名に「パスワード」「pass」等が含まれるか判定
‘ ※本来はバイナリ解析が必要ですが、まずはファイル名からの推測で実装
If LCase(objAttachment.FileName) Like “.zip” Then
If InStr(LCase(objAttachment.DisplayName), “pass”) > 0 Or _
InStr(LCase(objAttachment.DisplayName), “パスワード”) > 0 Then
‘ 警告フラグを立てる
objMail.FlagRequest = “【警告】パスワード付きZIPの可能性あり”
objMail.FlagStatus = olFlagMarked
objMail.Importance = olImportanceHigh
objMail.Save
Exit For ‘ 一つでも見つかれば終了
End If
End If
Next objAttachment
End If
End If
End Sub
—
3. コードのポイントを紐解く
① `EntryIDCollection` の真実
`NewMailEx` は、複数のメールが同時に届いた際にカンマ区切りでIDが渡されることがあります。今回はシンプルに実装していますが、大量のメールが届く環境では、`Split` 関数でIDを分解する処理を追加すると、より堅牢になります。
② `TypeOf` で型を安全に守る
メール以外のアイテム(会議の招待や受信確認など)が届いたときにコードが落ちないよう、`If TypeOf objItem Is MailItem` でチェックを入れています。これは、エラーを未然に防ぐエンジニアの嗜みです。
③ なぜ「保存」が必要なのか?
`objMail.Save` を忘れると、せっかくフラグを立ててもOutlookがその変更をメモリ上に留めてしまい、最終的に反映されません。「変更したらSaveする」。これがOutlook VBAの鉄則です。
—
4. この先へ進むために:次のステップ
このコードは「ファイル名の推測」に基づいています。もし、あなたがさらに高みを目指すなら、以下の技術に挑戦してみてください。
1. バイナリ解析: ZIPファイルのヘッダ情報を読み取り、本当にパスワードがかかっているか判定する(外部DLLやPowerShellとの連携)。
2. ログ出力: 警告を出したメールの送信者と時刻を、デスクトップのテキストファイルに追記して管理する。
—
最後に:自動化は「あなたの意志」の延長
自動化は、単なる手抜きではありません。「どうすれば安全に、効率よく業務が回るか」を考え、それをコードに落とし込む行為そのものが、あなたのエンジニアとしての価値を高めます。
ここをクリアしたあなたは、もう「マクロを記録する人」ではありません。「Outlookという巨大なシステムを制御する設計者」です。
何か分からないことがあれば、いつでもまた聞きに来てください。あなたの挑戦を、心から応援しています。
