2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Autonomous DBでOCIメール配信サービスを使用してメールを送信

Last updated at Posted at 2022-10-31

本ブログは、オラクル・クラウドの個人ブログの1つです。

初めに

前回の記事で、OCI電子メール配信サービスの概要を紹介しました。今回は「Autonomous Database」でこのサービスを使ってメールを送信する方法を紹介します。

検証環境
リージョン:東京
ワークロード・タイプ:Data Warehouse (19c)
アクセス・タイプ: (下記両方はOK)
✅ すべての場所からのセキュア・アクセスを許可
✅ VCN (プライベート・エンドポイント)

ステップ

事前準備

SMTP接続エンドポイントを取得 (Console)

東京リージョン:smtp.email.ap-tokyo-1.oci.oraclecloud.com
コンソールで情報を取得できます("電子メール配信 -> 構成")。
image.png
他リージョンは、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) 電子メール・ドメインをお持ちでない場合:
    電子メール配信 -> 承認済送信者
    image.png
  • b) 電子メール・ドメインをお持ちの場合:
    電子メール配信 -> 電子メール・ドメイン -> 承認済送信者
    image.png
    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.

ドキュメントの注意点

  1. ドキュメントのサンプルコードの次の行に注意してください。 変数hostの文字列は、電子メール・ドメインではなく、SMTP接続エンドポイントに置き換えてください。 これは重要です。そうしないと、メールを送信する際にエラーが発生します。
  2. サンプルコードの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での電子メールの送信

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?