【誤送信撲滅】Outlook VBAで「送信前の最終防衛ライン」を構築する極意
こんにちは。現場で叩き上げられたエンジニアなら誰もが一度はヒヤリとする「宛先間違い」。
どんなに技術が進化しても、人間の指先はたまに迷子になります。
今日は、あなたのOutlookを「AIのような鋭いチェック機能を持つツール」に進化させる、BeforeSendイベントを活用した安全対策を伝授します。
マクロの記録から一歩先へ。コードの「ライフサイクル」を意識する、エンジニアへの第一歩を一緒に踏み出しましょう。
—
1. なぜ「送信ボタンを押す前」なのか?
VBAには色々なイベントがありますが、メール送信において最も重要なのは `ItemSend` イベントです。
送信ボタンを押した瞬間にVBAが介入し、「ちょっと待った!」と割り込むことができるからです。
このコードを実装する場所は、標準モジュールではなく「ThisOutlookSession」です。ここが初心者が最初につまずくポイントです。
実装の手順
1. Outlookを開く。
2. `Alt + F11` でVBAエディタを開く。
3. 左側のプロジェクトツリーから `ThisOutlookSession` をダブルクリック。
4. 以下のコードを貼り付ける。
—
2. 宛先ドメインを監視する「番人」のコード
以下のコードは、送信しようとしている宛先の中に「自社のドメイン以外」が含まれていないかをチェックするロジックです。
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
‘ 1. 送信しようとしているのがメールか確認(予定表やタスクもItemに含まれるため)
If TypeOf Item Is MailItem Then
Dim mail As MailItem
Set mail = Item
‘ 2. ここに自社のドメインを指定(例: @example.co.jp)
Dim myDomain As String
myDomain = “@example.co.jp”
‘ 3. 宛先(To, CC, BCC)をすべて連結してチェック
Dim allRecipients As String
allRecipients = mail.To & “;” & mail.CC & “;” & mail.BCC
‘ 4. 外部ドメインが含まれているか判定
‘ 宛先が空でない場合かつ、自社ドメインを含まないアドレスが存在するか確認
If InStr(allRecipients, myDomain) = 0 Or InStr(allRecipients, “@”) > 0 Then
‘ ※簡易的に「@を含むが自社ドメインではない」ものを抽出するロジック
‘ 実際にはもう少し複雑な解析が必要ですが、まずはここから!
Dim msg As String
msg = “【警告】社外のアドレスが含まれています。” & vbCrLf & _
“送信してもよろしいですか?” & vbCrLf & vbCrLf & _
“宛先: ” & allRecipients
If MsgBox(msg, vbYesNo + vbCritical + vbDefaultButton2, “送信確認”) = vbNo Then
‘ 「いいえ」なら送信をキャンセル
Cancel = True
End If
End If
End If
End Sub
—
3. コードを読み解く:ここが重要!
初心者が陥りやすいエラーと、プロが意識するポイントを解説します。
- `ItemSend` の `Cancel` 引数:
この `Cancel` という変数がこのコードの心臓部です。`Cancel = True` を代入すると、Outlookの送信処理そのものが「強制停止」されます。これこそが自動化エンジニアが愛してやまない「制御」です。
- `TypeOf Item Is MailItem`:
Outlookではメール以外にも「会議招集」や「タスク」もItemとして扱われます。ここを忘れると、会議を送ろうとした瞬間にエラーが起きて慌てることになります。「対象を限定する」ことは、バグを防ぐ鉄則です。
- `InStr` 関数の活用:
文字列の中に特定の文字が含まれているかを判定する、VBAの基本関数です。これが使えるようになると、宛先解析だけでなく、件名の自動チェックなど応用範囲が一気に広がります。
—
4. プロの現場からのアドバイス:誤送信防止の「罠」
このコードを導入する際、気をつけてほしいことが一つあります。それは「過度なアラートは、いずれ無視される」ということです。
毎回すべてのメールにダイアログが出ると、人間は「OK」を連打する癖がついてしまいます。
- 改善案: 「メーリングリスト」や「頻繁にやり取りする取引先」はチェック対象から除外するロジックを加える。
- ステップアップ: `Recipients` コレクションを使って、アドレスごとにループ処理を回す実装に挑戦してみる。
—
まとめ:あなたの武器を磨こう
今回紹介した `ItemSend` イベントは、Outlook VBAにおける最強の「守護神」です。
まずはこのコードを実装して、自分の手で「送信を止める」という感覚を味わってください。
「自分の操作をプログラムで制御できる」。その面白さを知ったとき、あなたはもう脱初心者です。
次は、件名が空のときに自動で警告を出したり、特定のキーワードが入っているときに添付ファイルをチェックしたりと、自分だけの「最強のOutlook」を作り上げていきましょう。
応援しています。困ったときは、またいつでも聞きに来てくださいね。
