こんにちは!Outlook VBAの自動化の世界へようこそ。
マクロの記録から一歩踏み出し、「もっと実務で使えるカッコいいメールを作りたい!」と思っているあなたへ。
今回は、中級者へのステップアップとして絶対に知っておくべき「HTMLメールに動的なQRコード画像を埋め込む技術」を伝授します。
「メールの中にQRコードを入れるなんて、外部の画像URLを貼ればいいだけじゃないの?」と思ったそこのあなた。実はそれ、ビジネスメールとしては大きな落とし穴があるんです。多くのメーラー(Outlookなど)は、セキュリティのために外部サーバーからの画像読み込みをデフォルトでブロックしています。つまり、相手に届いた時には「真っ白な四角」になってしまっている可能性が高いのです。
そこで私たちが使うのが、「CID(Content-ID)参照」というプロの技。
メールの中に画像を“隠し添付”し、HTMLの本文からその画像内部を指し示すことで、外部ブロックを完全に回避して確実にQRコードを表示させるテクニックです。
ここをクリアすれば、Outlook VBAの基本はバッチリですよ!さあ、極限の知見を一緒に見ていきましょう。
—
1. CID参照の仕組み:なぜこの方法が必要なのか?
まずは概念をスッキリ理解しましょう。
通常のHTMLメールで画像を埋め込む場合、`
` のように書きます。しかしこれだと、受信者のパソコンがインターネット経由でその画像を取りにいかなければなりません。社内セキュリティが厳しい企業では、これが原因で画像が隠されてしまいます。
一方、今回解説するCID参照は以下のような仕組みです。
1. API等でQRコード画像を生成し、一時的にローカルPCに保存する
2. その画像を、MailItemの「添付ファイル」としてメールにこっそり忍ばせる
3. HTMLの本文から、添付された画像に対して `cid:ユニークなID` という形で直接リンクを貼る
これなら、メール単体で完結しているため、外部通信ブロックの影響を一切受けません。完璧ですね。
—
2. 【実践】動的QRコード埋め込みVBAコード
百聞は一見に如かず。実務でそのままコピペして使える完全版のコードをプレゼントします。今回は無料のQRコード生成API(Google Charts APIまたはGoQRme等)を利用して、動的にQRコード画像を取得するロジックを組み込んでいます。
VBAの「参照設定」で特別なライブラリを追加する必要はありません(実行時バインディングを使用しています)。
Sub CreateDynamicQRCodeMail()
Dim olApp As Object
Dim olMail As Object
Dim rngTarget As Object
Dim tempFilePath As String
Dim qrUrl As String
Dim fileNum As Long
Dim wHttp As Object
Dim bts() As Byte
Dim cID As String
Dim htmlBody As String
‘ 1. Outlookアプリケーションのインスタンスを取得
Set olApp = CreateObject(“Outlook.Application”)
Set olMail = olApp.CreateItem(0) ‘ 0 = olMailItem
‘ 2. QRコード化したいデータ(例:社内ポータルやキャンペーンURL)
Dim targetUrl As String
targetUrl = “https://www.example.com/campaign/2023”
‘ 3. 無料のQRコード生成APIのURLを組み立て
‘ ※サイズやエンコード指定などをお好みで変更可能
qrUrl = “https://api.qrserver.com/v1/create-qr-code/?size=150×150&data=” & UrlEncode(targetUrl)
‘ 4. WebからQRコードの画像データを取得し、一時ファイルとして保存
On Error GoTo ErrorHandler
Set wHttp = CreateObject(“MSXML2.XMLHTTP”)
wHttp.Open “GET”, qrUrl, False
wHttp.Send
If wHttp.Status = 200 Then
bts = wHttp.ResponseBody
tempFilePath = Environ(“TEMP”) & “\temp_qrcode.png”
‘ バイナリデータとして一時フォルダに書き出し
fileNum = FreeFile
Open tempFilePath For Binary Access Write As #fileNum
Put #fileNum, , bts
Close #fileNum
Else
MsgBox “QRコードの生成に失敗しました。ステータス: ” & wHttp.Status, vbCritical
Exit Sub
End If
‘ 5. Content-ID (CID) の一意な文字列を生成
cID = “myQRCode_ID_001”
‘ 6. HTMLメールの本文を構築
‘ タグの src に “cid:設定したID” を指定するのが最大のポイント!
htmlBody = “” & _
“
“
いつもお世話になっております。
” & _
“
ご案内いたしましたイベントのアクセス用QRコードをお送りいたします。
” & _
“
” & _
“
” & _
“
” & _
“
スマートフォンで読み取ってご利用ください。
” & _
“
以上よろしくお願いいたします。
” & _
“” & _
“”
With olMail
.Display ‘ 一度画面を表示して下書き状態にする(添付ファイルのプロパティを安定させるため)
‘ 7. 画像を添付ファイルとして追加
Dim atts As Object
Set atts = .Attachments.Add(tempFilePath)
‘ 8. 添付ファイルに対してCIDプロパティを割り当てる(隠しファイル化の核心)
‘ これにより、通常の「クリップマーク(添付ファイル一覧)」に表示されず、本文の一部として扱われます
atts.PropertyAccessor.SetProperty “http://schemas.microsoft.com/mapi/proptag/0x3712001E”, cID
‘ 9. メールのプロパティを設定
.To = “sample@example.com”
.Subject = “【ご案内】専用アクセス用QRコード送付”
.HTMLBody = htmlBody
End With
‘ 10. 一時ファイルの削除(メールに読み込まれているため、直前の削除はNG。今回はそのまま残すか、後処理に回す)
‘ ※実運用ではTempフォルダの掃除ロジックがあるとより美しいです。
MsgBox “QRコード付きHTMLメールの作成が完了しました!”, vbInformation
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
If fileNum > 0 Then Close #fileNum
End Sub
‘ 【補助関数】URLエンコードを行うための簡易関数
Function UrlEncode(Str As String) As String
Dim i As Long
Dim c As Integer
Dim Result As String
Result = “”
For i = 1 To Len(Str)
c = Asc(Mid(Str, i, 1))
Select Case c
Case 48 To 57, 65 To 90, 97 To 122, 45, 46, 95, 126
Result = Result & Chr(c)
Case 32
Result = Result & “+”
Case Else
Result = Result & “%” & Right(“0” & Hex(c), 2)
End Select Caset
Next i
UrlEncode = Result
End Function
—
3. コードのキモと、初心者が陥りがやすい罠
上記のコードには、Outlook VBAを極めた者ならではの「こだわり」と「トラップ回避策」が詰まっています。いくつか重要なポイントを解説します。
① `.Display` を挟む意味(ライフサイクルの重要性)
コードの途中で `.Display` を実行しています。「まだ送信したくないのに画面が出ちゃうの?」と思うかもしれませんが、Outlookのオブジェクトモデルにおいて、MailItemが生成された直後は、添付ファイルのMAPIプロパティ(CIDの設定など)が正しく書き込めない不具合が起きることがあります。
一度 `.Display`(または `.Save`)を挟むことで、内部オブジェクトを確実に実体化させ、安全にプロパティ操作ができるようになります。
② 添付ファイルを「隠しファイル」にする魔法のプロパティ
これが今回の最大の肝です。
atts.PropertyAccessor.SetProperty “http://schemas.microsoft.com/mapi/proptag/0x3712001E”, cID
このMAPIプロパティ(`PR_ATTACH_CONTENT_ID`)を操作することで、通常であればメールの右上や件名の横に出てしまう「クリップマーク(添付ファイル)」からその画像を消し去り、純粋にHTMLの埋め込み画像として機能させることができます。これができるようになると、ワンランク上の「プロの自動化ツール」が作れるようになります。
③ URLエンコードの必要性
QRコードに変換したいURLの中に、日本語や特殊文字(`?`, `=`, `&` など)が含まれている場合、そのままAPIに投げると正しく画像が生成されないことがあります。それを防ぐために `UrlEncode` 関数を挟み、安全な文字列に変換してからAPIを叩いています。
—
まとめ:自動化の地平を広げよう
今回は、HTMLメールへの動的QRコード埋め込みという、少し応用の利いたテーマを解説しました。
- 外部の画像はブロックされるリスクがある
- CID参照を使えば、安全かつ確実にインライン画像を表示できる
- MAPIプロパティを操作して、添付ファイルをスマートに隠すことができる
このテクニックを応用すれば、社内システムと連携して「社員ごとの個別ID入りQRコード付きメール」をワンクリックで何百通も自動生成・送信するといった、圧倒的な業務効率化が可能になります。
基本をマスターしたあなたなら、もうマクロの記録器にしがみつく必要はありません。ぜひ自分の環境でコードを動かして、その便利さを実感してみてください。
それでは、次回の極限の知見でお会いしましょう!
