【入門編】【上級者向け】受信メールのヘッダー情報を解析し、SPF/DKIM認証失敗メールを自動で隔離フォルダへ移動するセキュリティ自動化 – Outlook VBA解析バイブル

スポンサーリンク

Outlook VBAで「なりすまし」を撃退せよ!PropertyAccessorによるヘッダー解析の極意

こんにちは。現場で叩き上げ、数々の自動化プロジェクトを完遂してきたエンジニアです。

皆さんは普段、Outlookの「仕分けルール」に頼り切っていませんか?実は、GUIで設定できるルールは非常に限定的です。本物のメールエンジニアは、メールの「裏側」を見ています。

今回は、メールの身分証明書である「SPF/DKIM」の認証結果を解析し、怪しいメールを強制的に隔離フォルダへ叩き込むセキュリティ自動化のロジックを伝授します。マクロの記録から脱却し、Outlookの深淵へ踏み込みましょう。

—

1. なぜ「PropertyAccessor」が必要なのか?

通常、Outlookのオブジェクトモデル(`MailItem`)からは、件名や送信者などの表面的な情報しか取得できません。しかし、メールの本質は、見えない「MIMEヘッダー」に隠されています。

ここで登場するのが `PropertyAccessor` です。これは、Outlookが隠し持っている数千ものプロパティに直接アクセスするための「裏口の鍵」です。これを使えば、SPF/DKIMの結果が記録されている「Authentication-Results」ヘッダーを丸裸にできます。

—

2. 実装の設計図

今回は以下のステップで自動化を構築します。

1. `NewMailEx` イベント: 受信した瞬間に割り込む最強のフック。
2. `PropertyAccessor` による抽出: ヘッダー情報の抜粋。
3. 文字列解析: `fail` や `softfail` という文字列を検知。
4. 移動処理: 隔離フォルダへオブジェクトを移動。

—

3. 実践コード:セキュリティ自動化のコア

このコードは、`ThisOutlookSession` モジュールに記述してください。

‘ 受信時に自動発火するイベント
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
Dim objItem As Object
Dim ns As NameSpace
Set ns = Application.GetNamespace(“MAPI”)

‘ EntryIDからメールオブジェクトを取得
Set objItem = ns.GetItemFromID(EntryIDCollection)

‘ メールアイテムか確認(会議出席依頼などを除外)
If TypeOf objItem Is MailItem Then
Call AnalyzeAndQuarantine(objItem)
End If
End Sub

Private Sub AnalyzeAndQuarantine(mail As MailItem)
Dim pa As PropertyAccessor
Dim header As String
Dim targetFolder As Folder

‘ PropertyAccessorの作成(ここが魔法の鍵)
‘ MAPIプロパティタグ: 0x007D001E (PR_TRANSPORT_MESSAGE_HEADERS)
Set pa = mail.PropertyAccessor
header = pa.GetProperty(“http://schemas.microsoft.com/mapi/proptag/0x007D001E”)

‘ 認証結果に “fail” が含まれているかを確認(簡易的な判定)
‘ 本番運用では “spf=fail” や “dkim=fail” を詳細に正規表現で解析することを推奨
If InStr(1, header, “spf=fail”, vbTextCompare) > 0 Or _
InStr(1, header, “dkim=fail”, vbTextCompare) > 0 Then

‘ 隔離フォルダの取得(事前に「隔離」という名前のフォルダを作成しておくこと)
Set targetFolder = Session.GetDefaultFolder(olFolderInbox).Folders(“隔離”)

‘ 移動実行
mail.Move targetFolder
End If
End Sub

—

4. ここで躓くな!プロの注意点

① `NewMailEx` は「大量受信」に弱い

`NewMailEx` は受信したIDを個別に返しますが、短時間に数百通届くと処理が追いつかず、Outlookが重くなることがあります。本格的な業務利用では、処理を別プロセスに投げるか、エラーハンドリング(`On Error Resume Next`)を適切に入れ、ログを吐き出す仕組みが必須です。

② プロパティタグの深淵

コード内の `0x007D001E` は、メールヘッダーを指し示すMAPIプロパティのIDです。これらは「スキーマ」と呼ばれ、Microsoftの仕様書にのみ存在する深淵の知識です。今回のように `http://schemas.microsoft.com/mapi/proptag/0x007D001E` と記述することで、どんな環境でもヘッダーを抽出できます。

③ フォルダ名が存在しないエラー

`targetFolder` を取得する際、フォルダが存在しないとコードは即座に停止します。「フォルダがなければ作る」という `If targetFolder Is Nothing Then` のようなチェックロジックを組み込むのが、堅牢なコードへの第一歩です。

—

最後に:自動化の先にあるもの

いかがでしたか?`PropertyAccessor` を操れるようになれば、Outlookは単なるメールソフトから、強力な「情報処理エンジン」へと進化します。

「動いた」で満足せず、「なぜこのプロパティが必要なのか」「どうすればシステムに負荷をかけずに動くか」を常に自問自答してください。その姿勢こそが、あなたを真の自動化エンジニアへと押し上げます。

次は、このヘッダー解析に正規表現(`VBScript.RegExp`)を組み合わせて、より詳細な認証結果の判定に挑戦してみましょう。準備はいいですか?応援していますよ。

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