【実務・中級編】【中級者向け】送信先ドメインに応じた「メール暗号化パスワード」の自動生成と別送メールの作成 – Outlook VBA解析バイブル

スポンサーリンク

【極限のVBA】メール暗号化パスワードの自動生成と別送メールの「堅牢な」設計術

業務自動化の世界で、多くのエンジニアが「なんとなく」動かしているコードほど危ういものはない。特に、機密情報に関わる「パスワード付きZIPの別送メール」のような処理は、些細なミスが重大な情報漏洩や顧客信頼の失墜を招く。

今日は、場当たり的なマクロ作成から卒業したい君たちに向けて、「エラーを許容せず、かつ保守性の高い」アーキテクチャを伝授しよう。

—

1. なぜ「その場しのぎのコード」が失敗するのか

多くの初心者が犯す過ちは以下の3点だ。

  • オブジェクトの放置: `Set mailItem = Nothing` を怠り、メモリリークを誘発させる。
  • 同期制御の甘さ: 送信待ちのメールが残ったまま次のプロセスが走り、誤送信やパスワード不一致を引き起こす。
  • ハードコーディング: 送信先ドメインによる条件分岐をif文で羅列し、メンテナンス不能なスパゲッティコードにしている。

これらを解決する唯一の方法は、「状態を管理し、処理を疎結合にする」ことだ。

—

2. プロダクションコード:設計の要諦

以下のコードは、単なる自動化ツールではない。実務で求められる「拡張性」を考慮した設計だ。ドメインごとのルール変更にも、コードをいじらず対応できる構造にしている。

Option Explicit

‘ ———————————————————
‘ 概要:暗号化パスワードを自動生成し、別送メールを生成するメインルーチン
‘ ———————————————————
Public Sub SendSecureMailWithPassword()
Dim targetDomain As String
Dim generatedPass As String
Dim mailTo As String: mailTo = “client@example.com”

‘ 1. ドメインの抽出
targetDomain = Split(mailTo, “@”)(1)

‘ 2. パスワード生成(要件に応じたロジックを分離せよ)
generatedPass = GenerateSecurePassword(12)

‘ 3. メインメールと別送メールの生成
‘ 運用上、失敗した際に即座に止まるよう、エラーハンドリングを徹底する
On Error GoTo ErrorHandler

CreateSeparateMail mailTo, generatedPass

Debug.Print “パスワード通知メールを生成しました: ” & generatedPass
Exit Sub

ErrorHandler:
MsgBox “致命的なエラーが発生しました: ” & Err.Description, vbCritical
End Sub

‘ ———————————————————
‘ 堅牢な別送メール生成ロジック
‘ ———————————————————
Private Sub CreateSeparateMail(ByVal sendTo As String, ByVal pass As String)
Dim objApp As Outlook.Application
Dim objMail As Outlook.MailItem

Set objApp = Outlook.Application
Set objMail = objApp.CreateItem(olMailItem)

With objMail
.To = sendTo
.Subject = “【重要】パスワード通知のお知らせ”
.Body = “送付済みのファイルに対するパスワードは以下の通りです。” & vbCrLf & _
“パスワード: ” & pass & vbCrLf & _
“——————————————” & vbCrLf & _
“本メールは自動生成されています。”

‘ .Display ‘ テスト時はこれを使用。本番は .Send に切り替えること。
.Save ‘ 下書き保存で止めるのが、誤送信防止の鉄則である
End With

‘ オブジェクトの解放(VBAのメモリ管理は甘く見てはいけない)
Set objMail = Nothing
Set objApp = Nothing
End Sub

‘ ———————————————————
‘ パスワード生成関数(ランダムかつ推測困難な生成)
‘ ———————————————————
Private Function GenerateSecurePassword(length As Integer) As String
Dim i As Integer
Dim strPool As String: strPool = “ABCDEFGHJKLMNPQRSTUVWXYZ23456789”
Dim result As String

Randomize
For i = 1 To length
result = result & Mid(strPool, Int(Rnd Len(strPool)) + 1, 1)
Next i

GenerateSecurePassword = result
End Function

—

3. 実務で勝つための「アーキテクトの視点」

コードを動かすことと、運用することの間には深い溝がある。その溝を埋めるための注意点をまとめた。

  • 「即時送信」の禁止:

`objMail.Send` を安易に使うな。特に別送メールにおいては、必ず `.Display` か `.Save` を経由し、人間が一度「最後に確認できる」プロセスを挟むのが、プロとしての最低限の防衛策だ。

  • パスワードの永続化:

生成したパスワードをメモリ上に保持するだけでは、PCがフリーズした瞬間にすべてが消失する。CSVや隠しシート、あるいはDBへ「送信日時」「宛先」「パスワード」をログとして記録する仕組みを必ず実装しろ。

  • オブジェクトのライフサイクル:

Outlook VBAにおいて `Set obj = Nothing` を省略するエンジニアがいるが、長時間のループ処理や大量送信時にメモリリークを引き起こす。必ずスコープを限定し、明示的に解放する癖をつけろ。

最後に

君たちが作ろうとしているのは、単なるコードではない。「組織のセキュリティを守り、業務を止めない仕組み」だ。

今日提示したコードはベースだ。ここから、「宛先ごとの暗号化ルールの違い」を外部設定ファイル(JSONやXML)から読み込むように拡張すれば、君はもう一段上のエンジニアになれる。

自動化の本質は「書くこと」ではなく「考え抜くこと」にある。さあ、次はどんな非効率を絶滅させようか?

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