メール送信前に、電子メール・テンプレートの穴埋めを行なった結果を画面に表示して確認できないか、との相談がありました。調べてみたところ、プロシージャAPEX_MAIL.PREPARE_TEMPLATEを使うと、送信するメールのプレビューができそうです。
試しに実装してみました。
アプリケーションの作成は、Always FreeのAutonomous Database上のAPEX 21.2を使って行います。また、ソースとなるデータとして、サンプル・データセットのEMP/DEPTに含まれる表EMPを使用します。
以下より、サンプルの実装を紹介します。
アプリケーション作成ウィザードを起動します。名前はメール・プレビューとします。ホーム・ページは、編集をクリックして設定画面を開き、削除します。
ページの追加を実行し、ファセット検索を選択します。
ページ名は従業員検索とします。レポートの表示形式はレポート、表としてEMPを選択します。フォームを含めるにチェックを入れ、表EMPの編集ページも作成します。この編集ページを、電子メールのプレビューのページに作り直します。
ページの追加をクリックします。
アプリケーションの作成を実行します。
アプリケーションが作成されます。
フォームのページEmployeesを開き、メールのプレビューに作り直します。
リージョンEmployeesとボタンを削除します。これらのリージョンに配置されているページ・アイテムやボタンも削除します。
すべてのリージョンが無くなったところで、Content Bodyに新たにリージョンを作成します。
新規に作成したリージョンの識別の名前はプレビューとし、タイプにPL/SQL動的コンテンツを選択します。ソースのPL/SQLコードとして、以下を記述します。コード中で使っている電子メール・テンプレートORDERMAILは、この後に作成します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare | |
l_html clob; | |
l_text clob; | |
l_placeholders clob; | |
l_subject varchar2(4000); | |
begin | |
-- 表EMPの1行をJSONのプレースホルダーとして取り出す。 | |
select json_object(*) into l_placeholders | |
from ( | |
select empno, ename, mgr, job, to_char(hiredate,'DL') hiredate, sal | |
from emp where empno = :P2_EMPNO | |
); | |
-- テンプレートの穴埋めを行う。 | |
apex_mail.prepare_template( | |
p_static_id => 'ORDERMAIL' | |
, p_placeholders => l_placeholders | |
, p_application_id => :APP_ID | |
, p_subject => l_subject | |
, p_html => l_html | |
, p_text => l_text | |
); | |
-- リージョンにHTMLを印刷する。 | |
htp.p(l_html); | |
end; |
プレビューに影響を与える装飾をできるだけ無くすため、外観のテンプレートを- 選択 -に変更して、テンプレートを使わないようにします。
リージョンプレビューにページ・アイテムP2_EMPNOを作成します。タイプは非表示とします。このページ・アイテムに指定された従業員番号の従業員の情報を使って、電子メール・テンプレートの穴埋めを行います。
以上で、プレビューを行うページは作成できました。
共有コンポーネントの電子メール・テンプレートを開いて、テンプレートORDERMAILを作成します。
電子メール・テンプレートの作成を実行します。
テンプレート名をORDERMAIL(これはもっと読みやすい名前にできます)、静的識別子をORDERMAIL(これはコード中で使用しているので変更不可です)とします。電子メールの件名、HTMLフォーマットのヘッダー、本文、フッター、プレーン・テキスト・フォーマットのコンテンツを以下を参考に埋めていきます。(APIの動作さえ確認できればよかったので、正直、かなり手抜きです)。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
件名 | |
#ENAME#様、オーダーを確認しました。 | |
ヘッダー | |
<b style="font-size: 24px;">マイ・アプリケーション</b> | |
本文 | |
<strong>ようこそ、#ENAME#さん</strong>、<br> | |
<br> | |
オーダーありがとうございます。<br> | |
<br> | |
<strong>オーダー詳細</strong><br> | |
<br> | |
<table width="100%"> | |
<tr> | |
<th align="left">オーダー日</th> | |
<td>#HIREDATE#</td> | |
</tr> | |
<tr> | |
<th align="left">オーダー番号</th> | |
<td>#EMPNO#</td> | |
</tr> | |
<tr> | |
<th align="left">出荷先</th> | |
<td>#JOB#</td> | |
</tr> | |
<tr> | |
<th align="left" valign="top">出荷先住所</th> | |
<td> | |
東京都港区<br> | |
北青山1丁目 | |
</td> | |
</tr> | |
<tr> | |
<th align="left" valign="top">オーダー・アイテム</th> | |
<td>ラグビー・ボール</td> | |
</tr> | |
<tr> | |
<th align="left">オーダー合計</th> | |
<td>#SAL#</td> | |
</tr> | |
</table> | |
<br> | |
<br> | |
オーダーを変更しますか。<a href="#ORDER_URL#">お客様のオーダー#ENAME#はここで管理しています。</a> | |
フッター | |
<a href="#MY_APPLICATION_LINK#">「マイ・アプリケーション」にアクセスし、電子メール・プリファレンスを管理します</a>。 | |
プレーン・テキスト・フォーマット | |
ようこそ、#ENAME#さん、 | |
オーダーありがとうございます。 | |
オーダー詳細 | |
-------------------------------------------------------------------------------- | |
オーダー日: #HIREDATE# | |
オーダー番号: #EMPNO# | |
出荷先: 東京都 | |
出荷先住所: #SHIPPING_ADDRESS_LINE_1# | |
#SHIPPING_ADDRESS_LINE_2# | |
オーダー・アイテム: #ITEMS_ORDERED# | |
オーダー合計: #SAL# | |
-------------------------------------------------------------------------------- | |
オーダーを変更しますか。お客様のオーダー#ORDER_NUMBER#はここで管理しています: #ORDER_URL# |
テンプレートが決まったら、電子メール・テンプレートの作成を実行します。
電子メール・テンプレートORDERMAILが作成されます。
以上でアプリケーションは完成です。アプリケーションを実行すると、本記事の先頭にあるGIF動画のような動作をします。
今回のサンプルで表示しているのは、HTML本文のみです。件名やプレーン・テキストはプレビューに含めていません。それでも、確認した範囲ではAPEX_MAIL.PREPARE_TEMPLATEより得られたHTML本文は、十分、プレビューの役に立ちそうです。
今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/email-preview.sql
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完