UWSCR/UWSCでCDOではなく、APIでメールを送信する
はじめに
従来、UWSCやVBAでのメール送信はCDO(Microsoft Collaboration Data Objects)を使うのが一般的でした。
しかし現在、GmailではCDO経由の送信が困難になりつつあります。
この記事では、UWSCR/UWSCでSendGridのAPIを使い、より安定した送信方法を紹介します。
UWSCの時間は2017年で止まっている
UWSCは2017年の更新を最後に開発が止まっています。
本体が古いというだけでなく、それに関連する情報も多くが当時のままで、現在の環境ではそのまま使えないケースが目立ちます。
多くのスクリプト例では未だにCDOが使われていますが、Appパスワードの制限などにより、今では非推奨です。
SMTP設定の煩雑さや不安定さも課題です。
UWSCRとは
UWSCRは、UWSCと類似の構文を持ちながらも、設計思想を一新した別系統のスクリプト実行ツールです。UWSCの資産を活かしつつ、現代的な記法や環境に合わせた機能拡張が施されています。
正式にはUWSCの後継ではなく、互換性よりも実用性・保守性を重視して開発が進められています。そのため、構文や動作に差異がある場面もありますが、スクリプトベースの自動化を求めるユーザーにとっては有力な選択肢です。
APIを使って送信してみよう
SendGridはREST API経由でメールを送れるサービスです。
APIを使うことで、SMTPよりもシンプルかつ確実な送信が可能になります。
API送信までの準備(SendGrid)
- SendGridに登録(無料プランあり)
- APIキーを発行(Mail Send権限を付与)
- 送信元メールアドレスを認証(Single Sender Verification)
この3点がそろえば、APIでの送信が可能です。
UWSCRでの送信コード
UWSCRでは、HTTPリクエストとJSONを組み合わせて、API送信を実装できます。
mailTo = "friend@example.com"
mailFrom = "user@example.com" //SendGridで認証済みのアドレス以外不可
subject = "メールの件名"
body = "メールの本文\n改行はエスケープする"
json = @{
"personalizations":[{"to":[{"email":"<#mailTo>"}]}],
"from":{"email":"<#mailFrom>"},
"subject":"<#subject>",
"content":[{"type":"text/plain","value":"<#body>"}]
}@
apiKey = "SendGridで発行したapiキー"
url = "https://api.sendgrid.com/v3/mail/send"
request = WebRequestBuilder()
request.bearer(apiKey).header('Content-Type', 'application/json')
response = request.body(json).post(url)
if response.status <> 202 then msgbox("送信エラーです") //成功時は202が返る
- 検証環境:UWSCR(x64) Ver. 1.0.6
おまけ:UWSCでも同じことはできる
もちろんUWSCでも同じことはできます。今回のAPIはレスポンスをJSONで受ける必要はないので割と楽ですが、JSONのパースとかが必要になると少し(かなり)面倒です。
mailTo = "friend@example.com"
mailFrom = "user@example.com" //SendGridで認証済みのアドレス以外不可
subject = "メールの件名"
body = "メールの本文\n改行はエスケープする"
textblock jsonFormat
{
"personalizations":[{"to":[{"email":"<#mailTo>"}]}],
"from":{"email":"<#mailFrom>"},
"subject":"<#subject>",
"content":[{"type":"text/plain","value":"<#body>"}]
}
endtextblock
//置換処理
dim keys[] = "<#mailTo>", "<#mailFrom>", "<#subject>", "<#body>"
dim values[] = mailTo, mailFrom, subject, body
json = jsonFormat
for i = 0 to length(keys) -1
json = replace(json, keys[i], values[i])
next
//APIを叩く処理
apiKey = "SendGridで発行したapiキー"
url = "https://api.sendgrid.com/v3/mail/send"
with createoleobj("Msxml2.XMLHTTP")
.open("POST", url, FALSE)
.setRequestHeader("Content-Type", "application/json")
.setRequestHeader("Authorization", "Bearer " + apiKey)
.send(json)
if .status <> 202 then msgbox("送信エラーです")
endwith
- 検証環境:UWSC Ver. 5.3.0.2
まとめ
CDOはもはや現実的ではありません。
UWSCRを使えば、簡潔な構文でAPI経由の安定したメール送信が実現できます。
今後のスクリプト環境に適した手段として、一度試してみる価値はあります。
Discussion