【実務・中級編】【中級者向け】メール送信時に「添付ファイル名」から機密情報を検知し、送信を中断するセキュリティスキャン機能 – Outlook VBA解析バイブル

スポンサーリンク

【Outlook VBA】メール送信を「制御」せよ:添付ファイル名による機密情報検知と強制停止の実装

業務自動化において「送信ボタンを押す」という行為は、いわば最終防衛ラインだ。多くの開発者が `Application.ItemSend` イベントを安直に使い、泥縄式のエラーハンドリングで済ませている。だが、プロの現場では「止めるべき時に確実に止め、かつ処理を停止させない」という設計思想が求められる。

今回は、添付ファイル名をスキャンし、機密情報が含まれていた場合に送信を即座に無効化する、堅牢なセキュリティスキャン機能を実装する。

1. なぜ「単純なイベント処理」では不十分なのか

多くの初学者は、`ItemSend` イベント内で単純な `If` 文を書き、条件に合致すれば `Cancel = True` を設定して終わりにする。しかし、以下の落とし穴を考慮しているだろうか?

  • オブジェクトの生存期間: `MailItem` オブジェクトがメモリ上でどう振る舞うかを理解していないと、添付ファイルが見つからない(あるいはロックされている)瞬間にスクリプトがクラッシュする。
  • ユーザー体験の欠如: 単に送信をキャンセルするだけでは、ユーザーは「なぜ送れないのか」を理解できず、再送を繰り返すという非効率を生む。
  • 保守性の欠如: キーワードをコード内にハードコーディングすると、要件変更のたびにソースコードを修正することになる。

これらを解決する、エンジニアリングとしての解法を提示する。

2. プロダクションコード:セキュアな送信制御アーキテクチャ

このコードは、`ThisOutlookSession` に記述する。外部設定ファイル(今回は簡易的に定数で定義するが、実運用では外部JSON/DBを参照する構成にすべき)を分離させる設計が重要だ。

‘ — ThisOutlookSession に記述 —
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
‘ 対象がメールアイテムであるかを確認(会議出席依頼などもItemSendを通るため)
If TypeOf Item Is Outlook.MailItem Then
Dim mail As Outlook.MailItem
Set mail = Item

‘ スキャン処理の呼び出し
If IsSensitiveContent(mail) Then
‘ 送信を確実にキャンセル
Cancel = True
MsgBox “【警告】添付ファイル名に機密キーワードが含まれているため、送信を中断しました。” & vbCrLf & _
“管理規定に従い、ファイル名を確認してください。”, vbCritical, “セキュリティスキャン”
End If
End If
End Sub

‘ — 機密情報検知エンジン —
Private Function IsSensitiveContent(mail As Outlook.MailItem) As Boolean
Dim att As Outlook.Attachment
Dim forbiddenKeywords As Variant
Dim i As Integer

‘ 本来は外部テキストファイル等から読み込むことを推奨
forbiddenKeywords = Array(“極秘”, “Confidential”, “社外秘”, “未公開”)

‘ 添付ファイルが一つもない場合はスキャン対象外
If mail.Attachments.Count = 0 Then Exit Function

‘ 添付ファイル名をループしてチェック
For Each att In mail.Attachments
For i = LBound(forbiddenKeywords) To UBound(forbiddenKeywords)
If InStr(1, att.FileName, forbiddenKeywords(i), vbTextCompare) > 0 Then
‘ ログを残す設計(必要に応じてイベントログやテキストへ出力)
Debug.Print “検知: ” & att.FileName
IsSensitiveContent = True
Exit Function
End If
Next i
Next
End Function

3. 実務で「勝つ」ための設計のポイント

A. 堅牢な型判定

`If TypeOf Item Is Outlook.MailItem` を忘れるな。これを怠ると、会議室予約のキャンセルや予定の変更通知までこのスキャンに引っかかり、業務効率を劇的に低下させる原因となる。

B. 設定の外部化

上記の `forbiddenKeywords` 配列をコード内に書くのは、プロトタイプまでだ。実務では `Config.json` や、社内の共有フォルダにある設定ファイルを読み込むように改修せよ。そうすることで、セキュリティ担当者がエンジニアを介さずにキーワードを更新できる「運用可能なシステム」になる。

C. パフォーマンスへの配慮

添付ファイルが数十個ある場合、ループ処理は極めて重くなる可能性がある。しかし、`ItemSend` は送信直前の同期処理であるため、ここで複雑な外部DB参照を行うとOutlookがフリーズしたように見える。

  • 高速化のコツ: 添付ファイル名のチェックは「完全一致」ではなく「前方一致」や「特定のフラグ」をファイル名に含める運用ルールを徹底させ、検索コストを最小化することだ。

結論:自動化は「防波堤」であれ

自動化ツールの価値は、単に楽をすることではない。ヒューマンエラーという「不確定要素」をシステム的に排除し、組織のガードレールとして機能することにある。

この実装を導入した後は、是非「なぜそのファイル名がNGなのか」というフィードバックをユーザーに促す仕組み(例:社内イントラのリンクを表示する等)を組み込んでほしい。それが、真に価値ある業務自動化エンジニアの仕事だ。

さあ、コードを書き換えろ。あなたの書いたその数行が、明日の情報漏洩を防ぐかもしれないのだから。

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