「送信ボタンを押してから後悔しない」――Outlook添付ファイル自動監視・防衛システムの設計思想
業務自動化エンジニアとして多くの現場を見てきたが、最も「ヒヤリハット」が多いのがメール送信時の添付ファイルだ。大容量ファイルを誤って送信し、企業のセキュリティ規定に抵触する、あるいは相手方のメールサーバーでバウンスされる。これらは、ユーザーの善意や注意深さに依存してはいけない。
「人間はミスをする。だから、システムで制約を課す」
これが、堅牢な業務ツールを設計する際の鉄則だ。今回は、Outlookの送信プロセスに介入し、添付ファイルの合計サイズが閾値を超えた場合に即座に介入する「安全装置(セーフガード)」の設計論とコードを伝授する。
—
1. なぜ「送信イベント」のハンドリングが重要なのか
多くの初心者は「ボタンを押した後のマクロ」を個別に作成しがちだが、それはナンセンスだ。真のエンジニアは、Outlookの `ItemSend` イベントを掌握する。
`ItemSend` イベントは、送信ボタンが押された瞬間にトリガーされる。ここでファイルのサイズを計算し、キャンセル(Cancel = True)を投げることで、送信そのものを物理的に遮断できる。これが最も安全で、ユーザーに負荷をかけない設計だ。
—
2. 堅牢なコード実装:Attachment Guard
以下のコードを `ThisOutlookSession` に記述せよ。定数で閾値(バイト単位)を管理し、保守性を高めているのがポイントだ。
‘ 閾値の設定(例:10MB = 10 1024 1024)
Private Const MAX_ATTACHMENT_SIZE As Long = 10485760
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
Dim mail As MailItem
Dim att As Attachment
Dim totalSize As Long
‘ MailItem以外(予定表や連絡先など)は無視する堅牢な設計
If TypeOf Item Is MailItem Then
Set mail = Item
totalSize = 0
‘ 添付ファイルのサイズ合計を算出
For Each att In mail.Attachments
‘ 一時ファイルを経由せず、直接サイズを取得
totalSize = totalSize + att.Size
Next
‘ 閾値超過チェック
If totalSize > MAX_ATTACHMENT_SIZE Then
Dim msg As String
msg = “添付ファイルの合計サイズが制限を超えています。” & vbCrLf & _
“現在のサイズ: ” & Format(totalSize / 1024 / 1024, “0.0”) & ” MB” & vbCrLf & _
“送信をキャンセルします。ファイルを圧縮するか、クラウドストレージのリンクを利用してください。”
MsgBox msg, vbCritical + vbOKOnly, “送信エラー:容量超過”
‘ 送信の中断
Cancel = True
End If
End If
End Sub
—
3. 実務で「刺さる」設計の注意点
単にコードを動かすだけでは、プロフェッショナルとは呼べない。以下の3点を必ず考慮せよ。
① オブジェクトのライフサイクル管理
`For Each` ループ内で `Attachment` オブジェクトを扱っているが、大規模なメールの場合、参照が残るとメモリリークの原因になる。今回は簡潔さのために省略したが、もし添付ファイルを「自動削除」させる機能を実装する場合は、インデックスを逆順( `For i = mail.Attachments.Count To 1 Step -1` )で回すのが鉄則だ。順方向に回すと、インデックスのズレにより削除漏れが発生する。
② ファイルサイズ取得の精度
`att.Size` プロパティは、Outlookが添付ファイルを内部的に展開した状態のサイズを返す。しかし、圧縮ファイル(ZIP)などは、ファイルシステム上とOutlook上でサイズが微妙に異なる場合がある。厳密な制御が必要な場合は、`Scripting.FileSystemObject` との連携を検討すべきだが、通常の業務メールにおいては `att.Size` で十分な精度が得られる。
③ ユーザーエクスペリエンス(UX)の最適化
ただ「エラーで止める」だけでは、ユーザーはフラストレーションを感じる。
- 代替案の提示: エラーメッセージの中に「社内ファイル転送サーバーのURL」や「推奨圧縮ツールの場所」を明記せよ。
- ログ出力: 必要であれば、誰がいつ大容量ファイルを送信しようとしたかをテキストファイルやDBに書き出す仕組みを追加せよ。これがガバナンス強化の第一歩となる。
—
最後に:自動化は「防波堤」である
メールの送信を自動制御することは、単なる効率化ではない。「組織の信用を守る」というリスクマネジメントそのものだ。
今回提供したコードは、あなたのOutlook環境における最初の「防波堤」となる。ここから、ファイル共有サーバーへの自動アップロード機能や、特定ドメイン宛の場合のみ制限を緩和するロジックなどを付け加え、あなただけの「最強のメール自動化環境」を構築してほしい。
技術は、使う者の意志を反映する。ぜひ、現場で役立ててくれ。
