以前Accessからメールを送る方法としてoutlookを使う方法、CDOを使う方法をご紹介しました。
これらの方法は無料で手軽に実装できる方法として有効ですが、メールの到達率が悪い、ログの詳細が分からないなどデメリットもありました。
スパイラル(SPIRAL)のメール送信は到達率も高くログも詳細で重宝していたので、APIを使ってACCESSからのメール送信をスパイラルに切り替えることにしました。
スパイラルの契約は有料ですが量によっては低額で利用できますので検討してみてはいかがでしょうか?
https://asbepartners.com/send_mail/
なお、スパイラル(SPIRAL)については「スパイラルとは」のページをご確認ください。
スパイラルAPIを使ってACCESSからメールを送る方法
スパイラルからAPIでメール送信の概要
スパイラルを使ってメールを送るには、まずはテーブルに送信先アドレスなどのデータが格納されている必要があります。
主な手順は以下の通りです。
- スパイラルにメール送信用テーブルを作成する
- AccessからAPIを使ってデータを作成する(Delete/Insert)
- AccessからAPIを使ってメールを送信する
今回は①と②がすでに完了していることを前提に③の処理をご紹介します。
なお、①のテーブルにはメール宛先アドレス、配信エラー用フィールドが必須です。
本文に差し込みしたい場合は差し込み置換用のフィールドも用意しておきます。
https://asbepartners.com/spiral_delins/
スパイラルAPIをCALLする前の準備
スパイラルAPIの引数としてメール送信内容をJSON形式で作成する必要があります。
JSONを作成するにあたり、ConvertToJson()関数が必要になりますが、ConvertToJson()については以下の記事を参照してください。
https://asbepartners.com/convjson/
スパイラルAPI用のJSONデータ作成
メール送信用のサンプル情報はスパイラルのサポートサイトに公開されていますが、ちょっと分かりにくいかな…という印象です(;^_^A
Express2の機能でメール送信しますが、引数となるJSONの全項目はこちらのページに記載されています。
以下、最低限必要な項目のみ列挙します。
| ※1) spiral_api_token | APIトークン |
|---|---|
| ※2) passkey | epoch秒。 |
| ※3) signature | 署名 |
| db_title | DBテーブル名 |
| ail_field_title | メールアドレスフィールドのフィールド名 |
| reserve_date | 配信予約日時。 即時配信は、 now を指定する。00分と30分のみ指定可能。 |
| subject | 件名 |
| mail_type | メール種別 省略時はテキストメール扱い |
| body_text | 本文 |
| from_address | 差出人メールアドレス |
| from_name | 差出人名 |
| error_field_title | 配信エラーフィールドのフィールド名 |
| error_auto_update | 配信エラーを自動反映する。 反映する=true, 反映しない=false |
| error_auto_exclude | 配信エラーを除外する。 除外する=true, 除外しない=false |
※1 APIトークンはスパイラルにログイン後、開発タブ→APIトークン→【トークン発行】で取得した文字列です。
※2 epock(エポック)秒(UNIX時間)とは、1970年1月1日0時0分0秒からの経過秒数です。署名の有効期限チェックに使用されます。
※3 signatureはトークンとepock秒、シークレットコードをハッシュ化したものです。
以下、サンプルテキストです。
' *==============================================================
' * メール送信用のJsonテキスト作成処理
' *
' * @param strjson 作成したJsonテキスト
' * @return True/False
' *==============================================================
Public Function MakeJson(ByRef strjson As String, strTitle, strText, strFrom, strFromName) As Boolean
Dim param As New Dictionary
Dim intPass As Long
Dim strsignature As String
On Error GoTo Err_Exit
'戻り値の初期化
MakeJson = False
intPass = DateDiff("s", #1/1/1970 9:00:00 AM#, Now)
strsignature = HmacSha1(csToken & "&" & CStr(intPass), csSecret)
param.Add "spiral_api_token", csToken
param.Add "passkey", intPass
param.Add "signature", strsignature
param.Add "db_title", csMailTable
param.Add "mail_field_title", "f002188671"
param.Add "reserve_date", "now"
param.Add "subject", strTitle
param.Add "mail_type", "text"
param.Add "body_text", strText
'param.Add "body_html", 1
param.Add "from_address", strFrom
param.Add "from_name", strFromName
param.Add "error_field_title", "f002214251"
param.Add "error_auto_update", "true"
param.Add "error_auto_exclude", "false"
'連想配列からJSONフォーマットに変換
strjson = ConvertToJson(param)
Debug.Print strjson
MakeJson = True
Exit Function
Err_Exit:
MsgBox Err.Number & ":" & Err.Description, vbOKOnly + vbCritical
End Function
この関数には引数として以下の値を渡しています。
| strJSON | 完成したJSONデータを格納するフィールド |
|---|---|
| strTitle | メールの件名 |
| strText | メールの本文 |
| strFrom | 差出人メールアドレス |
| strFromName | 差出人名 |
これでスパイラルメール送信APIに渡すJSONデータの準備ができました!
メール本文に差し込み文字を挿入したい場合
本文に差し込み文字を挿入したい場合は、上記のJSON、body_textにメール送信用テーブル内のフィールド名をセットします。
[box05 title=”例”]
%val:usr:f002221957% 様
いつもお世話になっております。
この度は、〇〇へのお申込み誠にありがとうございます。
[/box05]
スパイラルAPIをCALLしてメール送信
後は出来上がったJsonデータを引数にAPI関数をコールします。
' *==============================================================
' * SPIRALのAPI関数コール
' *
' * @param request POST/GET
' * @param url
' * @param accesstken(Encodeが必要であればEncode済みの文字列)
' * @param param(jsonオブジェクト)
' * @return responseテキストデータ
' *==============================================================
Public Function CallSpiralApi(ByVal param As String, ByVal request_kind As String) As String
On Error GoTo Err_Exit
With CreateObject("MSXML2.XMLHTTP")
.Open "POST", "https://reg18.smp.ne.jp/api/service", False
'Basic認証
.setRequestHeader "X-SPIRAL-API", request_kind
.setRequestHeader "Content-Type", "application/json; charset=UTF-8"
.send param
'結果が戻るまで待機
Do While .readyState < 4
DoEvents
Loop
'デバッグは↓をアンコメントしてレスポンスを確認
Debug.Print .responseText
'.responseTextを戻り値とする
CallSpiralApi = .responseText
End With
Exit Function
Err_Exit:
MsgBox Err.Number & ":" & Err.Description, vbOKOnly + vbCritical
End Function
※送信後のログなどはスパイラルの配信履歴からログデータをダウンロードしてご確認ください。
まとめ
メールを確実に相手に届けるにはメール到達率の高いサービスを利用する必要があります。
その点ではスパイラルはかなり優秀だと思っていますので、ぜひ一度検討されてはいかがでしょうか?

コメント