🐔

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)

  1. SendGridに登録(無料プランあり)
  2. APIキーを発行(Mail Send権限を付与)
  3. 送信元メールアドレスを認証(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