2021年11月16日火曜日

Oracle APEX 21.2新機能(14) - 電子メール関連の拡張

 Oracle APEX 21.2の電子メール関連の拡張には以下があります。

  1. プロセス電子メールの送信にて、電子メール・テンプレートが利用できます。
  2. 自動化アクションとして、電子メールの送信を作成できます。
  3. テンプレートに含まれる置換文字列を置き換えるアイテムをUIで定義できます。
  4. プロセス電子メールの送信にて言語オーバライドを設定することにより、使用するテンプレートの言語を切り替えることができます。
  5. イメージをアタッチメントだけでなく、インラインで添付することができます。
  6. 電子メール・テンプレートコピーができます。
これらの機能を使うアプリケーションを作成してみます。


機能の紹介のためにカード・リージョンのサンプルに含まれている表EBA_DEMO_CARD_EMPのデータを使用します。GitHubのOracle APEXのsample-appsからsample-cards.sqlまたはsample-cards.zipをダウンロードして、インポートしておきます。



空のアプリケーションを作成します。アプリケーション作成ウィザードを起動し、名前電子メール送信とします。アプリケーションの作成をクリックします。

アプリケーションが作成されたらページ作成ウィザードを起動し、表EBA_DEMO_CARD_EMPに対して対話モード・レポートフォームのページを作成します。ページの作成をクリックします。

フォームを選択します。

フォーム付きレポートを選択します。

レポート・タイプ対話モード・レポートレポート・ページ名従業員一覧とします。フォーム・ページ名電子メール送信フォーム・ページ・モードモーダル・ダイアログとします。へ進みます。

ナビゲーションのプリファレンスとして、新規ナビゲーション・メニュー・エントリの作成を選択します。へ進みます。

データ・ソースローカル・データベースソース・タイプとします。表/ビューの名前としてカード・リージョンのサンプルに含まれる表EBA_DEMO_CARD_EMPを選択します。レポートに表示する列として、すべての列を選択します。へ進みます。

フォームに表示する列から、FILENAME(Varchar2)MIMETYPE(Varchar2)IMAGE_LAST_UPDATE(Date)を除外します。主キー型主キー列の選択を選んで、主キー列EMPNO(Number)とします。作成をクリックします。

対話モード・レポートとフォームのページが作成されます。ページを実行し作成されたフォームを確認します。

元々、表EBA_DEMO_CARD_EMPのデータを更新するためのフォームなので、Profile Imageがファイルの選択になっています。ここに画像を表示させます。

ページ・デザイナにてフォームのページを開き、ページ・アイテムP3_PROFILE_IMAGEを選択します。識別タイプイメージの表示に変更し、設定基準としてBLOB Column specified in Item Source代替テキスト列ENAMEファイル名列FILENAMEMIMETYPE列MIMETYPEBLOB最終更新列IMAGE_LAST_UPDATEを指定します。

変更した設定を保存し、アプリケーションを実行してProfile Imageの表示を確認します。

以上で準備は完了です。

これから変更の適用をクリックしたときに、データの更新の代わりに電子メールが送信されるように実装を変更します。

電子メールの文面を決める電子メール・テンプレートを作成します。共有コンポーネント電子メール・テンプレートを開きます。

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

テンプレート名EMP静的識別子EMPとします。

電子メールの件名は以下を入力します。

従業員 #ENAME# プロフィール

HTMLフォーマットヘッダーに以下を入力します。

<b style="font-size: 24px;">従業員プロフィール</b>

本文には以下を入力します。

<table width="100%">

  <tr>

    <th align="left">従業員番号</th>

    <td>#EMPNO#</td>

  </tr>

  <tr>

    <th align="left">従業員名</th>

    <td>#ENAME#</td>

  </tr>

  <tr>

    <th align="left">ジョブ</th>

    <td>#JOB#</td>

  </tr>

  <tr>

    <th align="left">採用日</th>

    <td>#HIREDATE#</td>

  </tr>

</table>

<br/>


フッターには以下を入力します。

<b style="font-size: 24px;">従業員画像</b>

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


従業員のプロフィールを電子メールの本文とする、簡単な電子メール・テンプレートが作成されました。


作成した電子メール・テンプレートを使って電子メールを送信するプロセスを定義します。ページ・デザイナにて電子メール送信フォームのページを開きます。

左ペインプロセス・ビューを表示し、プロセスプロセス・フォーム電子メール送信を選択します。

識別タイプ電子メールの送信に変更します。設定宛先&APP_USER.としています。これは有効なメール・アドレスがサインインのユーザー名となっているためです。そうで無い環境では、自分自身のメール・アドレスを直接指定すると良いでしょう。電子メール・テンプレートは先ほど作成したEMPを選択します。プレースホルダ値の設定については、この後に紹介します。添付SQLとして以下を記述します。設定の結果をできるだけ早く確認したいので、即時に送信ONにします。

select
    profile_image
    , filename
    , mimetype
    , utl_url.escape(filename) content_id
from eba_demo_card_emp
where empno = :P3_EMPNO

SQLの検索結果として4番目の列をcontent_id(cid)として指定しているため、PROFILE_IMAGEはインラインで添付されます。


プレースホルダ値をクリックし、テンプレートに含まれるプレースホルダ(置換文字列)にアイテムまたは値を割り当てます


設定を保存し、電子メールを送信してみます。

従業員のフォームを開いて、変更の適用をクリックすると電子メールが送信されます。


受信したメールを確認します。

Appleの標準メールでは、受信したメールは以下のように表示されました。


Office for Macではインラインの画像は表示されませんでした


添付SQLのヘルプに、一部の電子メール・クライアントはインライン添付を自動的に表示しない場合があることに注意してください。との記載があります。


添付SQLの4番目の列をコメント・アウトして、電子メールを送信してみます。

select
    profile_image
    , filename
    , mimetype
--    , utl_url.escape(filename) content_id
from eba_demo_card_emp
where empno = :P3_EMPNO

添付のイメージはアタッチメントとして送信されます。


Appleの標準メールではどちらでも同じ表示になりました。

イメージの添付の扱われ方はメール・クライアントに依存するので、必ずしもインラインにすると良いということではないようです。主要なメール・クライアントでどのように表示されるか確認したのち、アタッチメントにするかインラインにするか決めると良いでしょう。

電子メール・テンプレートはOracle APEXの翻訳の対象になっています。電子メール・テンプレートの文面を英語に翻訳し、新機能の言語オーバーライドを使ってみます。

共有コンポーネントアプリケーションの翻訳を開きます。


最初にアプリケーション言語の定義を行います。


まだ定義されている言語はありません。作成をクリックします。


翻訳アプリケーションとして、このAPEXインスタンス全体で未使用のアプリケーションIDを指定します。(自分で候補となる未使用のアプリケーションIDを探す必要あり。)言語として英語(en)を選択し、作成をクリックします。


英語翻訳アプリケーションが作成されます。


翻訳可能なテキストのシードを開きます。


英語の翻訳済みアプリケーションチェックを入れ、シードをクリックします。日本語で作成しているアプリケーションに含まれる翻訳可能なテキストを、英語のアプリケーションにコピー(シード)します。


翻訳対象となる文字列の数が更新されます。


翻訳リポジトリを開いて、シードされた文字列を翻訳します。電子メール・テンプレートに含まれる文字列は、シードの対象になっています。


テキストを従業員で検索します。電子メール・テンプレートに記載した文字列を一覧から見つけます。HTMLで記載されている4行の翻訳先を更新します

電子メールの件名にあたる翻訳先に以下を入力します。

Employee #ENAME# Profile

HTMLフォーマットヘッダーにあたる翻訳先に以下を入力します。

<b style="font-size: 24px;">Employee Profile</b>

本文にあたる翻訳先には以下を入力します。

<table width="100%">

  <tr>

    <th align="left">Employee#</th>

    <td>#EMPNO#</td>

  </tr>

  <tr>

    <th align="left">Employee Name</th>

    <td>#ENAME#</td>

  </tr>

  <tr>

    <th align="left">Job</th>

    <td>#JOB#</td>

  </tr>

  <tr>

    <th align="left">Hire Date</th>

    <td>#HIREDATE#</td>

  </tr>

</table>

<br/>


フッターにあたる翻訳先には以下を入力します。

<b style="font-size: 24px;">Employee Picture</b>


翻訳済アプリケーションのパブリッシュを開きます。


英語の翻訳済みアプリーションチェックを入れ、パブリッシュをクリックします。パブリッシュされると、翻訳されたアプリケーション(今回のケースでは翻訳された電子メール・テンプレート)を利用できます。


パブリッシュ直後はプライマリ・アプリケーションと翻訳済アプリケーションの間で差異がなくなるため、同期化が必要いいえになります。この後にプライマリ・アプリケーションに変更があると、同期化が必要はいに戻ります。


プロセス電子メールの送信言語オーバライドenを設定します。設定を変更後、アプリケーションを実行し電子メールを送信します。


送信された電子メールの文面が、英語に翻訳されていることが確認できます。


Oracle APEX 21.2の新機能を使った実装を紹介してきました。これ以外の追加された機能としては、以下があります。

自動化アクションタイプとして電子メールの送信を選ぶことができます。設定内容については、ページ・プロセスの電子メールの送信と同じです。


ちょっとした機能追加ですが、電子メール・テンプレートコピーができるようになっています。


文面が若干異なる電子メール・テンプレートを作ったりする際に、便利に使えるでしょう。


Oracle APEX 21.2の電子メール関連の機能拡張の紹介は以上です。

今回作成したアプリケーションのエクスポートを以下に置きました。カード・リージョンのサンプル・アプリケーションに含まれる表EBA_DEMO_CARD_EMPが存在していることを前提としています。
https://github.com/ujnak/apexapps/blob/master/exports/new212-email.sql

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