ハードコーディングという名の「負債」を断つ:JSON駆動型・動的メール配信アーキテクチャの構築
業務システムにおいて、メール配信ロジックがソースコードに直書きされている光景は、もはや「技術的負債」ではなく「時限爆弾」である。宛先の変更があるたびにコンパイルを伴う修正を強いるなど、アーキテクトの矜持が許さない。
今回は、Outlook VBAにおける「脱・ハードコーディング」を完遂するための、JSON設定ファイルを用いた動的メール配信システムの設計思想を伝授する。
—
1. なぜ「JSON駆動」なのか:疎結合の哲学
OutlookのVBAで宛先リストやCCの制御をコードに埋め込むと、運用開始後に必ず「CCに〇〇さんを追加してほしい」という要求が飛んでくる。これを防ぐための唯一の解は、「ロジック」と「データ」の物理的な分離だ。
我々は外部JSONをパーサー経由で読み込み、実行時にオブジェクトへ展開することで、再コンパイル不要な柔軟性を手に入れる。
2. アーキテクチャの要:JSONパーサーの選定
VBAには標準のJSONライブラリがない。だが、シニアエンジニアたるもの、外部依存を最小限に抑えるべきだ。
本稿では、軽量かつ堅牢な「VBA-JSON(`ScriptControl`を避け、ネイティブな辞書オブジェクトへのマッピングを推奨)」を利用する前提で話を進める。
※ `ScriptControl`は64bit環境で動作しないため、将来的なWindowsの進化を考慮すれば選択肢から外すのが賢明だ。代わりに、`ADODB.Stream`でファイルを読み込み、`JsonConverter`(GitHub等で公開されている著名なモジュール)でパースする手法を推奨する。
3. 実装:メモリリークを許さないオブジェクト管理
VBAにおいて、`MailItem`を生成し続けるとメモリリークの温床となる。特にループ処理内での生成は、必ず参照を明示的に解放しなければならない。
以下に、JSON設定ファイルを読み込み、動的に宛先を設定するプロトタイプを示す。
‘ 必要なライブラリ: Microsoft Scripting Runtime
‘ ※ JsonConverterモジュールをプロジェクトにインポートしておくこと
Public Sub SendDynamicMail(configPath As String)
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim jsonText As String
Dim config As Object
Dim olApp As Outlook.Application
Dim mail As Outlook.MailItem
‘ 1. ファイルI/Oの最適化: ADODB.Stream推奨(文字コード制御のため)
jsonText = ReadFile(configPath)
Set config = JsonConverter.ParseJson(jsonText)
Set olApp = New Outlook.Application
‘ 2. メールオブジェクトの生成
Set mail = olApp.CreateItem(olMailItem)
With mail
.To = Join(JsonArrayToCollection(config(“Recipients”)), “;”)
.CC = Join(JsonArrayToCollection(config(“CCs”)), “;”)
.Subject = config(“Subject”)
.Body = config(“Body”)
‘ 3. 送信処理(テスト時は .Display で確認)
.Send
End With
‘ 4. 厳格なメモリ解放: 参照カウンタを意識する
Set mail = Nothing
Set olApp = Nothing
Set config = Nothing
Set fso = Nothing
End Sub
‘ 外部JSONを読み込むためのストリーム処理
Private Function ReadFile(path As String) As String
Dim stream As Object
Set stream = CreateObject(“ADODB.Stream”)
stream.Charset = “UTF-8”
stream.Open
stream.LoadFromFile path
ReadFile = stream.ReadText
stream.Close
End Function
—
4. 極限の知見:シニアエンジニアが守るべき3つの鉄則
① `ScriptControl`は捨てろ
前述の通り、64bit Office環境が標準となった今、`MSScriptControl`は死んだ技術だ。`Late Binding`(遅延バインディング)を極め、環境依存を排除せよ。
② 宛先のバリデーションは「送信前」に行え
JSONの中身が壊れていた場合、`MailItem`のプロパティセット段階でエラーが起きる。`On Error GoTo`でのトラップは必須だが、それ以上に「設定ファイルのスキーマチェック」を別関数として切り出し、システムの入り口で弾く設計(ガード節)を徹底せよ。
③ `Set = Nothing` はおまじないではない
VBAのガベージコレクションを信じてはいけない。Outlookのインスタンスは特にメモリを食う。ループ内でメールを大量送信する際は、適宜 `DoEvents` を挟み、Windowsのメッセージループを枯渇させない配慮が、安定稼働の鍵となる。
結論
JSON駆動型の設計は、単なる「設定の外部化」ではない。それは、システムを「保守されるもの」から「変化に追従するもの」へと昇華させるための第一歩だ。
コードは書くことよりも、「いかに後から触りやすくするか」に全精力を注ぐべきである。それが、真に洗練されたエンジニアの仕事だ。次は、このJSONに送信条件(フラグ)を加え、条件分岐までをデータ駆動で制御する「メタプログラミング的アプローチ」を試みてほしい。
