【入門編】【初心者向け】メール送信直前に「宛先ドメイン」をチェックし、社外アドレスが含まれる場合に確認ダイアログを出す安全対策 – Outlook VBA解析バイブル

スポンサーリンク

【誤送信撲滅】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」を作り上げていきましょう。

応援しています。困ったときは、またいつでも聞きに来てくださいね。

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