DBCSで APEX_MAILを使ってメール送信（各種設定～テスト受信）

# TL;DR
前回の[投稿記事](https://qiita.com/viva1000/private/85735455380f9cdd292b)の続編です！
前の投稿では、APEXを Oracle Cloud の DBaaS（DBCS）にインストールして、
APEX機能のお試しができることろまで紹介しました。
正確には、APEXの管理者ユーザでログインできることまでですねｗ
DBCSで SEエディションを選択しておけば、コスト的にはお気軽に試せるはずです。

この記事では、[その環境](https://camo.qiitausercontent.com/16a7716e4953f6e4de429b67441d54e783a03c4e/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313837303436342f38663737383065382d383865332d336433642d636163632d6233346430643330643339322e706e67)でAPEX_MAILパッケージを使ってメールを送信してみます。

---

# 環境設定
[Database Cloud Service (DBCS / DBaaS) on OCI: How to Set Up APEX_MAIL](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2428364.1)
このドキュメント（ID 2428364.1）を参考に、必要な設定を施してきます。
※ドキュメントを見るにはオラクルのアカウトが必要です。

## 前提条件（補足情報）
前回記事の手順でDBCS等々を設定している前提で、
参照ドキュメントに記載のある項目の内、不要と判断したいくつの手順は **省略** しています...
気になる方は、ドキュメントの原文を参照にしてください。

## 1. APEXのメール設定
APEXのパラメータ「SMTP_REST_EMAIL_MODE」を無効（N）に設定
SMTPサーバーでメールを送信するためには、このパラメータを **N** にする必要があるもよう

- パラメータ「SMTP_REST_EMAIL_MODE」の確認方法
```
$ sudo su - oracle
$ sqlplus / as sysdba
SQL> ALTER SESSION SET CONTAINER = pdb1;
SQL> ALTER SESSION SET CURRENT_SCHEMA = APEX_210100;
SQL> SELECT wwv_flow_platform.get_preference( p_preference_name => 'SMTP_REST_EMAIL_MODE' ) as SMTP_REST_EMAIL_MODE FROM dual;
```
ここで、以下のように **N** が帰ってくるなら何もしなくてもOK。
```
SMTP_REST_EMAIL_MODE
--------------------------------------------------------------------------------
N
```
そうでなければ、（何も帰ってこない...なら、）
以下を実行して、**N** を設定してあげましょう。
```
SQL> BEGIN
  2      wwv_flow_platform.set_preference( p_preference_name => 'SMTP_REST_EMAIL_MODE', p_preference_value => 'N' );
  3      COMMIT;
  4  END;
  5  /
```

`PL/SQL procedure successfully completed.`
こちらのメッセージが表示されたら、
さっきの SELECT文 を再度実行して **N** が帰ってくるようになったこと確認しましょう。

## 2. APEXのウォレット作成
APEXにウォレットを作成するのですが、まず、
既にウォレットが作成されていないかを確認してから、作成することにしましょう。
既にウォレットがある場合は、パラメータ「WALLET_PATH」にウォレットのパスが入るもよう。

- パラメータ「WALLET_PATH」の確認方法
```
$ sudo su - oracle
$ sqlplus / as sysdba
SQL> ALTER SESSION SET CONTAINER = pdb1;
SQL> ALTER SESSION SET CURRENT_SCHEMA = APEX_210100;
SQL> SELECT apex_instance_admin.get_parameter( p_parameter => 'WALLET_PATH') as WALLET_PATH FROM dual;
```
ここで、以下のように何も帰ってこないことを確認します。
```
WALLET_PATH
--------------------------------------------------------------------------------

```
以下を実行して、ウォレットのパスを設定してあげましょう。
ここでは、`/home/oracle/APEX/wallet`を指定することにします。
```
SQL> QUIT
$ orapki wallet create -wallet /home/oracle/APEX/wallet -pwd WALLET_PASSWORD -auto_login
Operation is successfully completed. <------------------------- このメッセージを確認
$ ls /home/oracle/APEX/wallet
cwallet.sso  cwallet.sso.lck  ewallet.p12  ewallet.p12.lck <--- このメッセージを確認 
```

## 3. SMTPサーバーの証明書を取得
ルート証明書と中間証明書(.crtファイル)を取得し、DBCSノードにアップします。
※中間証明書は無くても動くみたいです。[コメント](https://qiita.com/viva1000/items/eedf5ae7886de07d4704#comment-cc9231e58e1cfed55b6e)で教えてもらいました。
- Downloadサイト
  https://www.digicert.com/kb/digicert-root-certificates.htm
    - Root Certificate - DigiCert Global Root G2
      https://cacerts.digicert.com/DigiCertGlobalRootG2.crt
    - Intermediate Certificate - DigiCert Global G2 TLS RSA SHA256 2020 CA1
      https://cacerts.digicert.com/DigiCertGlobalG2TLSRSASHA2562020CA1.crt
- アップロード
  - ファイル
  ・DigiCertGlobalRootG2.crt
  ・DigiCertGlobalG2TLSRSASHA2562020CA1.crt
  - コマンド
(例) `scp -i SSHキー DigiCertGlobal*.crt opc@DCBSノードのパブリックIP:/tmp`

## 4. ウォレットに証明書を追加
まず、ウォレット用のディレクトリに格納する。
```
$ sudo su - oracle
$ cp /tmp/DigiCertGlobal{RootG2,G2TLSRSASHA2562020CA1}.crt $HOME/APEX/wallet/
$ chmod 600 $HOME/APEX/wallet/*.crt
```
ルート証明書を追加
```
$ orapki wallet add -wallet /home/oracle/APEX/wallet -trusted_cert -cert "$HOME/APEX/wallet/DigiCertGlobalRootG2.crt" -pwd WALLET_PASSWORD
Operation is successfully completed. <------------------------- このメッセージを確認
```
中間証明書も追加
```
$ orapki wallet add -wallet /home/oracle/APEX/wallet -trusted_cert -cert "$HOME/APEX/wallet/DigiCertGlobalG2TLSRSASHA2562020CA1.crt" -pwd WALLET_PASSWORD
Operation is successfully completed. <------------------------- このメッセージを確認
```

## 5. APEXインスタンスの設定
- APEX管理ログイン
  - URL: https://パブリックIP:8443/apex/apex_admin
  - アカウント名: ADMIN
  - パスワード: 　Passw0rd_#1  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870464/10c1b3ec-43a7-53e4-8048-3de7cdbfe71a.png)

- インスタンスの管理 > インスタンスの設定 > ウォレット
  - ウォレット・パス：　　　file:/home/oracle/APEX/wallet
  - ウォレット・パスワード：WALLET_PASSWORD
  - [x] 　ウォレット・パスワードを変更するかどうかを確認する場合は選択

  → **[変更の適用]** ボタンを押下して登録
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870464/1f24bf24-39e1-d686-4435-6ac1bd14caab.png)

## 6. APEXメールサーバの設定
事前に設定している(はず)  [SMTPサーバ（Email Delivery）](https://qiita.com/viva1000/private/85735455380f9cdd292b#1-smtpサーバ)の設定をAPEXに登録します。
- インスタンスの管理 > インスタンスの設定 > 電子メール
  - SMTPホスト・アドレス: smtp.email.ap-tokyo-1.oci.oraclecloud.com
  - SMTPホスト・ポート: 587
  - SMTP認証ユーザー名: ocid1.user.oc1..aaaaaaaa(中略)@ocid1.tenancy.oc1..aaaaaaaa(中略).wm.com
  - SMTP認証パスワード: xxxxxxxxxxxxxxxxxxxx
  - [x] 　SMTP認証ユーザー名のパスワードを変更するかどうかを確認する場合は選択
  - SSL/TLSの使用: 接続の確立後
  - デフォルトの電子メール送信元アドレス: no-replay@sub.hogegegege.net

  → **[変更の適用]** ボタンを押下して登録
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870464/ba39d29a-876e-ebf0-b808-d41036e9fba5.png)

これで、設定は完了。

---

# 送信テスト（AEPX_MAILで送信）
## 1. APEXワークスペースの作成
- ワークスペースの管理 > ワークスペースの作成
    - ワークスペース名：  test1
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870464/c7644e71-033a-694f-738e-b99100ef780d.png)

    → **[次へ]** ボタンを押下。
    - スキーマ名：        test1
    - スキーマのパスワード：u3#Sy2s_q5cX (適当にw)
    - 域割当て制限(MB)：  100
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870464/3ed34c8c-31fd-8c5c-ed2d-91a6dcc8b8bc.png)

    → **[次へ]** ボタンを押下。
    - 管理者のユーザ：    test1
    - 管理者のパスワード：test1（ログイン時に変更させる）
    - 電子メール：        test1@test.co.jp（なんでも良い）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870464/8e748cf9-ce00-d98a-b0d8-f88d4e16fb84.png)

    → **[次へ]** ボタン、**[ワークスペースの作成]** ボタン、**[完了]** ボタンを順に押下し、サインアウトする。

## 2. APEXワークスペースにサインイン
- ワークスペースの管理 > ワークスペースの作成
    - ワークスペース名：  test1
    - ユーザ名：          test1
    - パスワード：        test1（初回ログイン時にパスワード変更を要求される）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870464/368c030a-bd13-fa32-b912-df1d351de09c.png)

## 3. APEX_MAILで、メール送信を実行！
- SQLワークショップ > SQLコマンド > 以下のスクリプトを **[実行]** する。
```
BEGIN
    APEX_MAIL.SEND(
        p_to   => '宛先@メアド.com',
        p_from => 'no-reply@sub.hogegegege.net',
        p_subj => 'Test from APEX_MAIL',
        p_body => 'テスト成功！'
    );
    APEX_MAIL.PUSH_QUEUE;
END;
/
```
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870464/c5cce71d-9548-f53c-aed2-7049670e7abb.png)


少ししたら`宛先@メアド.com` にメールが届くとおもいます。
お疲れ様でした。

---

# 参考
何がしかの理由でメール送信ができない場合、送信できなかったメールはキューに溜まります。
```
$ sudo su - oracle
$ sqlplus / as sysdba
SQL> ALTER SESSION SET CONTAINER = pdb1;
SQL> SELECT count(*) FROM APEX_MAIL_QUEUE;
  COUNT(*)
----------
         1
```
SMTPの認証で失敗した場合などもここにたまる。
[SwaksなどのSMTPのプロトコル・ログを確認できるクライアント](https://qiita.com/viva1000/items/29d6dccd19904461c1aa)で、
どこにNGがあるのか調査しましょう。