こんにちは!マクロの記録から一歩抜け出し、自分の手でOutlookを自在にコントロールしたいと思っているあなたへ。
今日は、現場で一番恐れられているトラブル「メールの誤送信」を、VBAの力でスマートに防ぐ実践的なテクニックを授けましょう。
ここをクリアすれば、Outlook VBAの基本イベントの仕組みと、実務で使える防御的プログラミングの感覚がグッと掴めます。ぜひ最後までついてきてくださいね。
—
なぜ「送信時チェック」が必要なのか?
「あ!取引先A社宛のメールに、ライバル企業のB社の担当者のアドレスが混ざっている……!」
送信ボタンを押した瞬間、背筋が凍るような思いをしたことはありませんか?人間は疲れている時や焦っている時ほど、宛先のミスを犯すものです。
もちろん、Microsoft 365のルールや有料のゲートウェイ製品で対策することもできますが、「自分の手元のOutlookが、送信する直前にそっと肩を叩いて注意してくれたら」安心ですよね。
今回は、Outlook VBAの強力なフック機能である `ItemSend` イベントを使い、「社外のドメインが含まれている場合に、警告を出して送信をストップする」仕組みを作っていきます。
—
準備:VBAを書くための魔法の扉を開こう
まずは、OutlookでVBAを記述するエディタ(VBE)を開きます。
1. Outlookの画面で [Alt] + [F11] キーを押します。
(これだけで開発者の扉が開きます。カッコいいですね!)
2. 左側のツリービューにある `ThisOutlookSession`(日本語表示なら `このOutlookセッション`)をダブルクリックします。
ここに書くコードは、Outlookが起動している間、常に裏側であなたの動作を監視・手助けしてくれる特別なコードになります。
—
実装コード:宛先ドメインを監視するガーディアン
以下のコードを、先ほど開いた `ThisOutlookSession` の中にそのままコピー&ペーストしてください。
Option Explicit
‘ ==============================================================================
‘ 【テーマ】送信直前の宛先ドメイン監視による誤送信防止フック
‘ 概要: 宛先に「自社ドメイン」以外が含まれている場合、警告を表示して送信を制御します。
‘ ==============================================================================
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
On Error GoTo ErrorHandler
‘ 1. 処理対象が「メール」であるかを厳密にチェック
If Item.Class <> olMail Then Exit Sub
Dim mail As MailItem
Set mail = Item
‘ ————————————————————————–
‘ 【設定エリア】自社のドメインを指定してください(@マークから記述)
‘ ————————————————————————–
Const MY_DOMAIN As String = “@your-company.co.jp”
Dim recipient As Recipient
Dim hasExternalRecipient As Boolean
hasExternalRecipient = False
‘ 2. 宛先(To, Cc, Bcc)をすべてスキャンする
For Each recipient In mail.Recipients
‘ 連絡先グループ(配布リスト)の場合はアドレスが直接取れないため除外またはスキップ
‘ 今回は簡易的に「メールアドレスに自社ドメインが含まれているか」を判定
If InStr(1, recipient.Address, MY_DOMAIN, vbTextCompare) = 0 Then
‘ 自社ドメインが含まれていない = 社外アドレスとみなす
hasExternalRecipient = True
Exit For ‘ 1つでも社外が見つかったらループを抜けてOK
End If
Next recipient
‘ 3. 社外アドレスが含まれていた場合のハンドリング
If hasExternalRecipient Then
Dim msgResult As VbMsgBoxResult
msgResult = MsgBox(“【警告】社外のアドレスが含まれています!本当に送信しますか?” & vbCrLf & _
“送信を中止する場合は「いいえ」を押してください。”, _
vbYesNo + vbExclamation + vbDefaultButton2, _
“送信前セキュリティチェック”)
‘ 「いいえ」が選ばれたら、送信をキャンセルする
If msgResult = vbNo Then
Cancel = True
‘ 親切心で、作業中のメール画面はそのまま残す
End If
End If
Exit Sub
ErrorHandler:
‘ 予期せぬエラーでメール送信自体がブロックされないための安全装置
MsgBox “マクロの実行中にエラーが発生しました: ” & Err.Description, vbCritical
Cancel = True
End Sub
—
コードの構造を紐解く:プロの着眼点
このコードがなぜ綺麗に動くのか、初心者の方が躓きやすいポイントを交えて解説します。
1. `Application_ItemSend` という「最強のフック」
通常のマクロは「ボタンを押したら動く」ものですが、Outlookの `ThisOutlookSession` 内にあるイベントプロシージャは、Outlookの特定の行動(メール送信、受信、フォルダ移動など)に連動して自動的に発動(フック)します。
今回は `ItemSend` を使っているので、ユーザーが「送信」ボタンを押した瞬間、宇宙で一番最初にこのコードが割り込み処理として実行されます。
2. `Cancel = True` の魔法
もし「社外秘のメールなのに間違えて宛先に入れた!」と気づいてユーザーが警告ダイアログで「いいえ」を選んだ場合、コード内の `Cancel = True` が実行されます。
これにより、Outlookは「送信処理を無かったことにする(キャンセルする)」ため、誤送信を物理的に食い止めることができるのです。
3. `InStr` 関数によるドメイン判定
`InStr(1, recipient.Address, MY_DOMAIN, vbTextCompare)` は、「宛先のアドレスの中に、自社ドメインの文字列が含まれているか?」を左から順に探す関数です。
含まれていれば位置(数字)が返り、含まれていなければ `0` が返ります。この仕組みを使って「自社以外」を正確に炙り出しています。
—
初心者がハマりがちな「落とし穴」と対策
このコードを実際に動かすとき、いくつかの注意点があります。ここをクリアすればもうバッチリです。
1. マクロのセキュリティ設定
Outlookの初期設定では、マクロはセキュリティ上の理由で無効化されています。
[ファイル] > [オプション] > [セキュリティ センター] > [セキュリティ センターの設定] > [マクロの設定] から、「すべてのマクロに警告を表示する」または「デジタル署名されたマクロ以外のすべてのマクロを有効にする」を選択してください。
2. 自分自身のドメイン名の書き換え
コード内にある `Const MY_DOMAIN As String = “@your-company.co.jp”` の部分は、必ずご自身の会社のメールドメイン(例: `@rakuten.co.jp` や `@sony.co.jp` など)に書き換えてください。
3. 社外アドレスがすべて悪者になるわけではない
このコードは「社外が入っていれば一律で警告」します。もし「よくやり取りする特定の協力会社ドメインは警告を出したくない」という場合は、ループ内に `If` 文を追加して除外するロジックにブラッシュアップすることも可能です。
—
まとめ
いかがでしたか?
今回は、Outlook VBAの基本イベントである `ItemSend` を活用し、実務に直結する誤送信防止フィルターを作りました。
- イベントプロシージャを使って、Outlookの「送信」の瞬間に割り込む方法
- `Cancel = True` で送信を強制ストップさせる技術
- 宛先コレクション (`Recipients`) をループして1件ずつ精査する基本形
これらはすべて、業務自動化エンジニアが日常的に使っている堅牢なプログラミングの思考そのものです。
ここをクリアできれば、もうあなたは「マクロの記録」を卒業し、自分の意志でOutlookをデザインできるエンジニアの仲間入りです。
ぜひ、ご自身の環境で試してみてくださいね。あなたのOutlookライフが、より安全で快適なものになりますように!
