本ブログは、オラクル・クラウドの個人ブログの1つです。
初めに
前回の記事で、OCI電子メール配信サービスの概要を紹介しました。今回は「Autonomous Database」でこのサービスを使ってメールを送信する方法を紹介します。
検証環境
リージョン:東京
ワークロード・タイプ:Data Warehouse (19c)
アクセス・タイプ: (下記両方はOK)
✅ すべての場所からのセキュア・アクセスを許可
✅ VCN (プライベート・エンドポイント)
ステップ
- 事前準備
- 1. SMTP資格証明を生成 (Console)
- 2. ポリシーを作成 (Console)
- 3. 承認済送信者を作成 (Console)
- 4. メールユーザーにSMTPアクセスを許可 (ADB - 管理者)
- 5. 電子メールを送信するPL/SQLプロシージャを作成 (ADB - メールユーザー)
- 6. テスト電子メールを送信 (ADB - メールユーザー)
事前準備
SMTP接続エンドポイントを取得 (Console)
東京リージョン:smtp.email.ap-tokyo-1.oci.oraclecloud.com
コンソールで情報を取得できます("電子メール配信 -> 構成")。
他リージョンは、SMTP接続の構成を参照してください。
新しいDBユーザーを作成 (ADB - 管理者)
ADB管理者ユーザー(ADMIN)で手軽い検証だけをする場合は、このステップをスキップしてもよいです。
「ADMIN」ではなく、別の専用のメール・ユーザーを使用することをお勧めします。この場合は、管理者ユーザーで「Autonomous DB」に接続し、次のコマンドを実行してユーザーを新規作成し、必要な権限を付与します。
-- USER SQL
CREATE USER "EMAILUSER" IDENTIFIED BY "<password>"
DEFAULT TABLESPACE "DATA"
TEMPORARY TABLESPACE "TEMP";
-- ROLES
GRANT "CONNECT" TO "EMAILUSER" ;
-- SYSTEM PRIVILEGES
GRANT CREATE ANY PROCEDURE TO "EMAILUSER" ;
GRANT EXECUTE ANY PROCEDURE TO "EMAILUSER" ;
プライベート・サブネット内のADBを利用する場合
SMTP接続エンドポイントに通信するには、OCIネットワークの下記箇所が正しく設定ていることをご確認ください。
ルート・テーブル
プライベート サブネットに紐づいているルート・テーブルに「NATゲートウェイ」または「サービス・ゲートウェイ」を追加します。
エグレス・ルール (Egress Rule)
セキュリティ・リスト (または NSG) でTCP ポート587が許可されていることを確認します。
1. SMTP資格証明を生成 (Console)
電子メール配信を介した電子メール送信のためには、Simple Mail Transfer Protocol (SMTP)の資格証明が必要です。セキュリティのベスト・プラクティスは、すでに権限が割り当てられているコンソール・ユーザーではなく、新規ユーザーに対してSMTP資格証明を生成することです。
新しいOCIユーザーを作成してログインします。それで下記を参照してSMTP資格証明を作成してください。
OCI Email Deliveryでメールを送信するクイック・スタート - STEP 1
2. ポリシーを作成 (Console)
新しいOCIユーザーは、email-family
リソースを管理する権限を持つ必要があります。テナンシ管理者としてログインし、下記を参照してポリシーを作成してください。
OCI Email Deliveryでメールを送信するクイック・スタート - STEP 2
ステートメント: Allow group <group name> to manage email-family in compartment <compartment name>
3. 承認済送信者を作成 (Console)
新しいOCIユーザー(ポリシー付与された)としてログインし、下記を参照して承認済送信者を作成してください。
OCI Email Deliveryでメールを送信するクイック・スタート - STEP 4
作成後、以下のように送信者の情報を取得できます。
- a) 電子メール・ドメインをお持ちでない場合:
電子メール配信 -> 承認済送信者
- b) 電子メール・ドメインをお持ちの場合:
電子メール配信 -> 電子メール・ドメイン -> 承認済送信者
DKIM署名付きの電子メール・ドメインは必須ではありませんが、強くお勧めします。このテストではこれを使っています。
4. メールユーザーにSMTPアクセスを許可 (ADB - 管理者)
管理者(ADMIN)ユーザーで Autonomous DB に接続し、次のコマンドを実行します。
BEGIN
-- Allow SMTP access for Email User
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'smtp.email.ap-tokyo-1.oci.oraclecloud.com',
lower_port => 587,
upper_port => 587,
ace => xs$ace_type(privilege_list => xs$name_list('SMTP'),
principal_name => 'EMAILUSER',
principal_type => xs_acl.ptype_db));
END;
/
出力結果:PL/SQL procedure successfully completed.
ドキュメントの注意点
-
ドキュメントのサンプルコードの次の行に注意してください。 変数
host
の文字列は、電子メール・ドメインではなく、SMTP接続エンドポイントに置き換えてください。 これは重要です。そうしないと、メールを送信する際にエラーが発生します。
- サンプルコードの
principal_name
の行は、"ADMIN"ユーザーにSMTPアクセスを許可していますが、 別のユーザーに変更することをお勧めします。このテストでは、新規作成のユーザーEMAILUSER
を使っています。
5. 電子メールを送信するPL/SQLプロシージャを作成 (ADB - メールユーザー)
メールユーザーとして Autonomous DB に接続し、電子メールを送信するPL/SQLプロシージャを作成します。
作成例:
CREATE OR REPLACE PROCEDURE SEND_MAIL (
msg_to varchar2,
msg_subject varchar2,
msg_text varchar2 )
IS
mail_conn utl_smtp.connection;
username varchar2(1000):= '<SMTP credential username>';
passwd varchar2(50):= '<SMTP credential password>';
msg_from varchar2(50) := '<Approved Sender>';
mailhost VARCHAR2(50) := 'smtp.email.ap-tokyo-1.oci.oraclecloud.com';
BEGIN
mail_conn := UTL_smtp.open_connection(mailhost, 587);
utl_smtp.starttls(mail_conn);
UTL_SMTP.AUTH(mail_conn, username, passwd, schemes => 'PLAIN');
utl_smtp.mail(mail_conn, msg_from);
utl_smtp.rcpt(mail_conn, msg_to);
UTL_smtp.open_data(mail_conn);
UTL_SMTP.write_data(mail_conn, 'Date: ' || TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') || UTL_TCP.crlf);
UTL_SMTP.write_data(mail_conn, 'To: ' || msg_to || UTL_TCP.crlf);
UTL_SMTP.write_data(mail_conn, 'From: ' || msg_from || UTL_TCP.crlf);
UTL_SMTP.write_data(mail_conn, 'Subject: ' || msg_subject || UTL_TCP.crlf);
UTL_SMTP.write_data(mail_conn, 'Reply-To: ' || msg_to || UTL_TCP.crlf || UTL_TCP.crlf);
UTL_SMTP.write_data(mail_conn, msg_text || UTL_TCP.crlf || UTL_TCP.crlf);
UTL_smtp.close_data(mail_conn);
UTL_smtp.quit(mail_conn);
EXCEPTION
WHEN UTL_smtp.transient_error OR UTL_smtp.permanent_error THEN
UTL_smtp.quit(mail_conn);
dbms_output.put_line(sqlerrm);
WHEN OTHERS THEN
UTL_smtp.quit(mail_conn);
dbms_output.put_line(sqlerrm);
END;
/
出力結果:Procedure SEND_MAIL compiled
変数 username : <SMTP credential username>
を実際の文字列で置き換えます (step-1で生成)。
変数 passwd : <SMTP credential password>
を実際の文字列で置き換えます( step-1で生成)。
変数 msg_from : <Approved Sender>
を実際の文字列で置き換えます(step-3で作成)。
変数 mailhost : 他のリージョンを使用する場合は変更してください。
6. テスト電子メールを送信 (ADB - メールユーザー)
メールユーザーとして Autonomous DB に接続し、次のコマンドでテスト用メールを送信します。 (<Recipient_Email_Address>
を実際のメールアドレスに置き換えてください。)
コマンドの書き方:
exec send_mail('<メールの宛先>','<メールの表題>','<メールの本文>')
exec send_mail('<Recipient_Email_Address>', 'Email from Oracle Autonomous Database', 'Sent using UTL_SMTP');
出力結果:PL/SQL procedure successfully completed.
以上
関連記事
オラクル・クラウドの個人ブログ一覧
OCI電子メール配信サービスの概要
OCI Computeにログインする時にメール通知を送信する方法
公式ドキュメント
Autonomous Databaseでの電子メールの送信