【入門編】【中級者向け】受信メールの添付ファイルが画像の場合のみ、OCR処理を外部API経由で呼び出しテキスト化する連携 – Outlook VBA解析バイブル

スポンサーリンク

こんにちは!エンジニアリングの世界へようこそ。
これまでマクロの記録ボタンを押してコードを眺めたり、「動くけれど、なぜ動くのか分からない」という状態にモヤモヤしていませんか?

大丈夫。今日、ここで「Outlook VBAのライフサイクル」と「外部API連携の本質」を掴めば、あなたの自動化スキルは間違いなく中級者の扉をノックすることになります。

今回は、「受信したメールに画像が添付されていたら、それを自動で外部のOCR(文字認識)APIに投げ、読み取ったテキストをメールの本文やログに埋め込む」という、実務で引く手あまたな高度自動化システムを一緒に作っていきます。

ここをクリアすれば、Outlook VBAとWeb APIの世界はあなたの手の中です。さあ、いってみましょう!

—

1. 現場のアーキテクチャ:なぜOutlookからAPIを叩くのか?

まず、私たちがこれから構築する仕組みの全体像を頭に描いてください。

[メール受信]
↓ (ItemAddイベントが検知)
[VBAスクリプト起動]
↓ (添付ファイル判定:jpg/pngか?)
[一時フォルダへ画像保存]
↓ (WinINet / MSXML2.DOMDocument 等でHTTP POST)
[外部OCR API]
↓ (JSON形式でテキストが返却される)
[Outlook側でテキスト処理](本文追記・フラグ付与など)

ここで重要なのは、「Outlookは本来メールクライアントであり、Web APIのクライアントではない」という点です。VBAからHTTP通信を行うには、Windowsの標準コンポーネント(`MSXML2.ServerXMLHttp.6.0` など)を巧みに操る必要があります。

このアーキテクチャを理解していれば、OCRだけでなく、AI(ChatGPT)APIと連携してメールの要約を自動返信させるシステムへも、簡単に応用できるようになりますよ。

—

2. 陥りやすい罠:初学者が必ずハマる3つのポイント

コードを書く前に、実務で必ず直面する「落とし穴」を先回りして共有しておきます。

1. イベントの多重起動と無限ループ
`ItemAdd` イベントは、メールが受信トレイに入った瞬間に走ります。処理の中で「メールにフラグをつける」「既読にする」といった変更を加えると、Outlookが再びイベントをトリガーしてしまい、スクリプトが無限ループに陥ることがあります。
2. APIキーのハードコーディング厳禁
VBAのコード内に直接APIキー(パスワードのようなもの)を書くのはセキュリティ上、御法度です。環境変数や外部設定ファイル(INIやJSON)から読み込むのがプロの作法ですが、今回は学習用として定数定義で解説します。
3. 同期通信のタイムアウト
画像サイズが大きいと、OCRの解析に数秒かかります。VBAのHTTPリクエストがタイムアウトエラーを起こさないよう、適切なタイムアウト設定が必要です。

—

3. 実装コード:受信メールを監視しOCRと連携するVBA

それでは、Outlookの `ThisOutlookSession` に貼り付けて即座に使える実用コードを公開します。

今回は分かりやすさを優先し、一般的なREST API(イメージとしてGoogle Cloud Vision APIやAzure AI Visionなどを想定したHTTP POSTリクエスト)を模した構造にしています。

【コードの設置場所】

Outlookを開き、 `[Alt] + [F11]` でVBAエディタを開き、左ツリーの `ThisOutlookSession` をダブルクリックして以下のコードを貼り付けてください。

Option Explicit

‘ ==============================================================================
‘ 定数定義(ご自身の環境やAPI仕様に合わせて書き換えてください)
‘ ==============================================================================
Const API_URL As String = “https://api.example-ocr-service.com/v1/extract”
Const API_KEY As String = “YOUR_API_KEY_HERE”
Const TEMP_FOLDER As String = “C:\Temp_Outlook_OCR\”

‘ 受信トレイを監視するためのオブジェクト変数(WithEventsが必須!)
Private WithEvents InboxItems As Outlook.Items

‘ ==============================================================================
‘ 1. Outlook起動時に監視をスタートするイベント
‘ ==============================================================================
Private Sub Application_Startup()
Dim ns As Outlook.NameSpace
Set ns = Application.GetNamespace(“MAPI”)

‘ デフォルトの受信トレイを取得
Set InboxItems = ns.GetDefaultFolder(olFolderInbox).Items

MsgBox “OCR連携メール監視システムが正常に起動しました。”, vbInformation, “初期化完了”
End Sub

‘ ==============================================================================
‘ 2. 新着メールを検知したときに走るメインイベント
‘ ==============================================================================
Private Sub InboxItems_ItemAdd(ByVal Item As Object)
On Error GoTo ErrorHandler

‘ 受信したアイテムが「メール(MailItem)」か厳密にチェック
If TypeName(Item) = “MailItem” Then
Dim mail As Outlook.MailItem
Set mail = Item

‘ 添付ファイルが存在するか確認
If mail.Attachments.Count > 0 Then
Dim att As Outlook.Attachment
Dim i As Long

For i = 1 To mail.Attachments.Count
Set att = mail.Attachments(i)

‘ 画像ファイル(jpg, jpeg, png)か判定
If IsImageFile(att.FileName) Then

‘ 一時フォルダの作成(なければ作る)
EnsureFolderExists TEMP_FOLDER

Dim savePath As String
savePath = TEMP_FOLDER & att.FileName

‘ 添付ファイルをローカルに保存
att.SaveAsFile savePath

‘ 外部OCR APIを呼び出してテキストを取得
Dim ocrText As String
ocrText = CallOcrApi(savePath)

‘ 取得したテキストをメールの本文に追記し、件名を変更
mail.Body = mail.Body & vbCrLf & “— [OCR自動抽出結果] —” & vbCrLf & ocrText
mail.Subject = “[OCR処理済] ” & mail.Subject

‘ 変更を保存
mail.Save

‘ 処理済みフラグとしてカテゴリを付与
mail.Categories = “OCR処理完了”
mail.Save

‘ 一時ファイルの削除(クリーンアップ)
If Dir(savePath) <> “” Then Kill savePath

End If
Next i
End If
End If

Exit Sub

ErrorHandler:
Debug.Print “Error: ” & Err.Description
‘ 実運用ではここでエラーログをファイルやTeams等に飛ばすと完璧です
End Sub

‘ ==============================================================================
‘ 3. 拡張子が画像ファイルか判定するヘルパー関数
‘ ==============================================================================
Private Function IsImageFile(fileName As String) As Boolean
Dim ext As String
ext = LCase(Mid(fileName, InStrRev(fileName, “.”) + 1))

Select Case ext
Case “jpg”, “jpeg”, “png”, “bmp”
IsImageFile = True
Case Else
IsImageFile = False
End Select
End Function

‘ ==============================================================================
‘ 4. フォルダの存在確認と自動生成を行うヘルパー関数
‘ ==============================================================================
Private Sub EnsureFolderExists(folderPath As String)
If Dir(folderPath, vbDirectory) = “” Then
MkDir folderPath
End If
End Sub

‘ ==============================================================================
‘ 5. 外部APIへHTTPリクエストを送信するコアロジック
‘ ==============================================================================
Private Function CallOcrApi(filePath As String) As String
Dim http As Object
Set http = CreateObject(“MSXML2.ServerXMLHTTP.6.0”)

‘ ※注意: 本格的なマルチパートフォームデータ送信(画像バイナリ送信)は
C ‘ APIの仕様に合わせたペイロード構築が必要です。
‘ ここでは通信の枠組みを提示します。

Dim payload As String
payload = “{ “”image_path””: “”” & Replace(filePath, “\”, “\\”) & “”” }”

‘ タイムアウト設定 (接続:10秒、送信/受信:30秒)
http.setTimeouts 10000, 10000, 30000, 30000

‘ APIエンドポイントへPOSTリクエスト送信
http.Open “POST”, API_URL, False
http.setRequestHeader “Content-Type”, “application/json”
http.setRequestHeader “Authorization”, “Bearer ” & API_KEY
http.send payload

‘ レスポンスのハンドリング
If http.Status = 200 Then
‘ 簡易的にレスポンス文字列をそのまま返却
‘ (実際にはVBA-JSON等のパーサーを使ってパースすることを推奨)
CallOcrApi = http.responseText
Else
CallOcrApi = “[エラー] OCR APIの呼び出しに失敗しました。ステータス: ” & http.Status
End If

Set http = Nothing
End Function

—

4. コードの深掘り:ここがエンジニアのこだわりポイント

このスクリプトが「ただ動くだけのコード」と一線を画す理由を解説します。

  • `WithEvents` による非同期イベント監視

`Private WithEvents InboxItems As Outlook.Items` と宣言することで、Outlookが裏側でメールを受信した瞬間に自動で割り込み処理を行わせることができます。人間がボタンを押す必要はもうありません。

  • メモリとリソースのクリーンアップ

API通信用のオブジェクトやファイルシステム操作の後、必ず `Set http = Nothing` や `Kill savePath` を挟んでいます。これを怠ると、Outlook本体がメモリリークを起こして重くなる原因になります。プロは後始末を美しく行います。

—

5. 動作確認とトラブルシューティング

コードを貼り付けたら、一度Outlookを再起動するか、VBAエディタ内で `Application_Startup` プロシージャの中にカーソルを置き、[F5]キー(または再生ボタン)を押して初期化関数を手動実行してください。その後、自分宛てに画像(`test.jpg` など)を添付したテストメールを送信してみましょう。

よくあるエラーと対処法

  • 「コンパイルエラー: ユーザ定義型は定義されていません」が出る

→ 参照設定が足りていない可能性があります。VBAエディタの `[ツール]` > `[参照設定]` から 「Microsoft Outlook 16.0 Object Library」 にチェックが入っていることを確認してください。

  • セキュリティの警告が出てマクロが動かない

→ Outlookの「マクロの設定」が「すべてのマクロを警告を表示せずに無効にする」になっていないか確認してください。「警告を表示してすべてのマクロを有効にする」またはデジタル署名を設定する必要があります。

—

まとめ:ここをクリアすれば、あなたはもう中級者!

お疲れ様でした!今回は「Outlookのイベント監視」「ファイルシステム操作」「外部Web APIとのHTTP連携」という、業務自動化の三種の神器を組み合わせた高度なテーマを解説しました。

ここをマスターしたあなたなら、社内のあらゆる定型業務をシステム化するポテンシャルを十分に秘めています。ぜひ、ご自身の業務環境に合わせてAPIのURLや処理をカスタマイズし、最強の自動化環境を作り上げてくださいね。

それでは、次回の実践的なテクニック解説もお楽しみに!

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