2020年4月24日金曜日

Emailキャンペーンを行うアプリケーションの作成(2) - APEXアプリケーションの作成

こちらの記事の続きになります。

OCI Email Deliveryを通してOracle APEXから電子メールを送信できるようになりました。これから、Salim Hlayelの記事にある電子メールによるキャンペーンを行うアプリケーションを作ります。
 


スキーマを定義する



Oracle APEXのアプリケーションを作成する前に、データベースに表を作成します。

SQLワークショプユーティリティクイックSQLを開きます。

クイックSQLの以下のモデルから、表を作成します。
#prefix: cust
#language: ja
customers /insert 10
  name 
  email
  gender vc6 /values 男性, 女性
  marital status /values 既婚, 死別, 独身
  country vc255 /values 米国, 日本, 英国
モデルを画面左側に書き込み、SQLの生成SQLスクリプトを保存レビューおよび実行を順次クリックします。


SQLスクリプトを保存をクリックするとポップアップが開きます。

スクリプト名を入力してスクリプトの保存をクリックします。


スクリプトを保存したのち、レビューおよび実行をクリッックします。

レビューおよび実行をクリックすると、SQLワークショップSQLスクリプトに含まれるスクリプト・エディタへ画面が遷移します。生成されたスクリプトを編集できます。

今回は編集は不要です。そのまま実行をクリックします。
 

実行内容の確認を求められます。即時実行をクリックします。
 

13行が成功していてエラーが無いことを確認します。

アプリケーションの作成をクリックします。



アプリケーションを作成する



SQLスクリプトの実行結果が表示されている画面の、右上にあるアプリケーションの作成をクリックします。

確認画面が表示されるので、再度、アプリケーションの作成をクリックします。


アプリケーション作成ウィザードが起動します。

作成するアプリケーションの名前電子メールキャンペーンとしています。

今回はホームページを使用しないため、編集をクリックしてダイアログを開きページを削除します。残りは対話レポートのページだけなので、自動的にレポートのページがホームになります。その他はデフォルトから変更しません。

アプリケーションの作成をクリックします。


アプリケーションが作成されると、開発画面に遷移します。作成されたアプリケーションを実行します。

アプリケーションの実行をクリックします。
 

アプリケーションへのサインインを要求されます。

デフォルトでは、Oracle APEXのワークスペースに登録されているユーザーによって認証されます。開発画面へのログインに使用したユーザー名とパスワードを入力してください。
 

クイックSQLを使って表を作成した際に、顧客のサンプル・データとして10行投入しています。ですので10人分の顧客がリストされています。
 

この顧客の中から、独身男性を選択します。

Gender(性別)のヘッダーをクリックしフィルタ条件として男性を選びます。続けて、Marital Status(婚姻状況)のヘッダーをクリックし、独身を選びます。フィルタ条件は、アクション・メニューに含まれるフィルタからも設定できます。どのようなフィルタ条件を設定しても、これ以降の作業に影響はありませんので、好みのフィルタ条件を設定して構いません。
 

このように対話モード・レポートでフィルタ条件を指定してリストされた顧客に、電子メールを送付する機能を作成します。
 

電子メールのテンプレートを作成する



キャンペーンとして送信する電子メールのテンプレートを作成します。

テンプレートは置き換え可能な顧客名や商品名の記述を含みます。テンプレートに含まれる顧客名や商品名といった情報は、電子メールとして送信する際に実際のデータで置換します。

共有コンポーネントユーザー・インターフェースに含まれる、電子メール・テンプレートを開きます。
 

定義済みの電子メール・テンプレートの一覧画面が開きます。

電子メール・テンプレートの作成をクリックします。
 

想定しているキャンペーンに即したテンプレートを登録します。

識別として、テンプレート名静的識別子電子メールの件名を設定します。テンプレート名、静的識別子は英数字限定です。
  • テンプレート名: New Year Promotion from Japan Branch
  • 静的識別子: NEW_YEAR_PROMOTION_FROM_JAPAN_BRANCH
  • 電子メールの件名: 新春プロモーション - 東京
画面では以下のようになります。
 

HTMLフォーマットでの電子メールのヘッダー本文フッターを設定します。

ヘッダー

<b style="font-size: 24px;">New Year Promotion!</b>

本文

<b>こんにちは #CUSTOMER#さん</b><br>
<br>
<b>ただいま私たちのオンラインショップからの購入に限り、最大<span style="color: red;">75%</span>の割引を実施しております:</b><br>
<br>
<table width="100%">  
  <tr>
    <th align="left">セール期間の開始</th>
    <td>#START_DATE#</td>
  </tr>
  <tr>
    <th align="left">セール期間の終了</th>
    <td>#END_DATE#</td>
  </tr>  
  <tr>
    <th align="left" valign="top">対象店舗</th>
    <td>#LOCATION#</td>
  </tr>  
  <tr>
    <th align="left" valign="top">ご案内</th>
    <td>#NOTES#</td>
  </tr>
    <tr>
    <th align="left" valign="top">対象製品</th>
    <td>#ITEMS!RAW#</td>
  </tr>
</table>
<br>
<b>数量に限りがこざいますので、ご購入はお早めに。</b><br>
<br>

フッター

<a href="#MY_APPLICATION_LINK#">This App created proudly using Oracle APEX</a>.
画面では以下のようになります。
 

置換文字列#CUSTOMER#のように、前後に'#'を付加して表現します。

CUSTOMERとして与えた文字列は、HTMLとしてエスケープ(例えば>&gt;"&quot;とする)した上で置き換えられます。これは、クロスサイトスクリプティングというセキュリティ上のリスクへの対応です。#ITEMS!RAW#として!RAWを指定すると、エスケープ処理は抑制されます。例えば置き換える文字列に<br>が含まれていると、デフォルトでは<br>と画面にそのまま表示されますが、!RAWが指定されるとHTMLタグ本来の意味である改行として扱われます。さらに、プレーン・テキスト・フォーマットの指定にある#ITEMS!STRIPHTML#のように!STRIPHTMLが指定されると、HTMLのタグ自体が置き換え対象から除外されます。<br>であれば、<br>が丸ごと除外されます。

電子メール・テンプレートの説明はマニュアルのこちら、置換文字列の説明はこちらにあります。


プレーン・テキスト・フォーマット



最近はあまりないと思いますが、HTMLの表示ができないクライアント向けにプレーン・テキスト・フォーマットでの本文を設定します。
Hello #CUSTOMER#,
This email is to remind you of an upcoming event you are associated with.
Sale Starts: #START_DATE#
Sale Ends:   #END_DATE#
Location:    #LOCATION#
Notes:       #NOTES#
Items:       #ITEMS!STRIPHTML#
View additional details at: #MY_APPLICATION_LINK#
画面では以下のようになります。
 

テンプレートの設定は以上です。


サンプルAPIの使用状況



最後にサンプルAPIの使用状況を確認しておきます。

このテンプレートの使用を前提とした、APEX_MAILパッケージのSENDプロシージャの記述方法が示されます。このテンプレートが、CUSTOMER, END_DATE, ITEMS, LOCATION, MY_APPLICATION_LINK, NOTES, START_DATEの置換文字列を含んでいることがわかります。

以上で、電子メール・テンプレートの作成をクリックし、テンプレートを作成します。


電子メール・テンプレートが作成されました。



電子メールを送信するフォームを作成する



対話レポートで選択済みの顧客を対象として、キャンペーンを案内する電子メールを一括で送信するプロシージャーを作成します。

以下のコードをSQLワークショップSQLコマンドに貼り付け実行すると、対話レポートで選択済みの顧客に電子メールを送信するプロシージャーsend_chanpaign_emailが作成されます。電子メールの本文は、登録したテンプレートをそれぞれの顧客名と、キャンペーン開始日(p_start_date)、キャンペーン終了日(p_end_date)、対象店舗(p_location)、案内文(p_notes)、対象商品(p_items)で穴埋めします。

 

フォームを作成する



作成したプロシージャを呼び出し、電子メールを送信するフォームを作成します。

ページの作成をクリックします。
 

ページの作成のダイアログでレガシー・ページを開き、ローカル・プロシージャのフォームを選択します。


ページ番号としてページ名として電子メールの送信ページ・モードモーダル・ダイアログを選択します。ページ・モードがモーダル・ダイアログなので、ナビゲーションブレッドクラムの使用ナビゲーションの使用ともにOFFになります。

へ進みます。
 

作成するページに含まれるフォームを送信したときに呼び出されるプロシージャを指定します。

プロシージャの所有者には現在作業中のワークスペースに紐づいたスキーマがデフォルトで設定されます。変更の必要はありません。ストアド・プロシージャ名として、先ほど作成したプロシージャSEND_CAMPAIGN_EMAILを選びます。プロシージャを選択すると、その引数がフォームに含まれるプロシージャ引数の選択に一覧されます。

デフォルトでSEND_CAMPAIGN_EMAILプロシージャが持つすべての引数が含まれるので、それはそのままにします。ラベル表示タイプをそれぞれ以下のように設定します。
  • P_START_DATE: キャンペーン開始日、日付ピッカー
  • P_END_DATE: キャンペーン終了日、日付ピッカー
  • P_LOCATION: 対象店舗、テキスト・フィールド
  • P_NOTES: 案内文、テキスト・フィールド
  • P_ITEMS: 対象商品、テキスト・フィールド
以上を設定したのち、作成をクリックします。


電子メールを送信するページが作成されます。

ページ・アイテムP3_ITEMSタイプをHTMLの入力が可能なようにリッチ・テキスト・エディタに変更します。設定書式HTMLです。電子メール・テンプレートでは#ITEMS!RAW#としてHTMLをエスケープせずに埋め込む記述になっていますので、P3_ITEMS(ラベル名は対象商品)として記載したHTMLは、電子メールでもHTMLとしてレンダリングされて表示されます。
 

以前にページ・アテイムに入力された値が保存されないよう、すべてのページ・アイテムセッション・ステートストレージリクエストごと(メモリーのみ)に変更します。


プロセス・ビューを開き、プロセスRun Stored Procedureを選択します。

識別タイプAPIの呼出しに変更し、設定タイプとしてPL/SQL Procedure or FunctionプロシージャまたはファンクションとしてSEND_CAMPAIGN_EMAILを選択します。パラメータはデフォルトで、適切なページ・アイテムが割り当たります。


以上で電子メールを送信するページは完成です。


対話モード・レポートから電子メールの送信ページを開く



電子メールの送信を行うページはモーダル・ダイアログとして作成されています。ですので、かならず基底となるページがあって、そのページからダイアログとしてページを開きます。

作成したページをダイアログとして開くボタンを、対話モード・レポートがあるページに追加します。

ページ1をページ・デザイナで開きます。そして、右ペインに表示されているレンダリング・ツリーのBreadcrumb Barに含まれる電子メールキャンペーンのリージョン上でコンテキスト・メニューを表示させ、ボタンの作成を実行します。
 

作成したボタンにたいして、識別ボタン名SEND_MAILラベル電子メールの送信レイアウトボタン位置Nextとし、動作アクションとしてこのアプリケーションのページにリダイレクトターゲットとして電子メールを送信するページを指定します。
 

ターゲットの設定は以下になります。

タイプこのアプリケーションのページページです。


対話モード・レポートの詳細静的IDとして、CUSTOMERSを設定します。


以上でページの変更を保存し、実行します。

ボタン電子メールの送信をクリックすると、追加で作成したキャンペーンの電子メールを送信するダイアログが開きます。
 

これで電子メールによるキャンペーンを行うアプリケーションは完成です。


電子メールを送信する



独身男性を対象としたキャンペーンを想定して、電子メールを送信してみます。

対話モード・レポートでGenderを男性、Marital Statusを独身としてフィルタします。リストに現れるEmailはサンプル・データであるため、このままではメールの送信は確認できません。送信されたメールを受け取ることができる電子メール・アドレス(大抵はこの作業を行っている本人の電子メール・アドレスになるかと思います)を設定してください。サンプル・データの電子メール・アドレスは実際の電子メール送信には使わないでください。

電子メール・アドレスを修正した後、電子メールの送信ボタンをクリックし、ダイアログを開きます。
 

電子メールの穴埋め項目に与えるデータは任意です。思い思いのデータを入力して、右下の送信ボタンをクリックします。
 

以下のような電子メールの受信を確認できたら、動作確認も完了です。
 

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/email-campaign.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。