Autonomous AI Database からOCIメール配信サービスでメールを送信する方法

Database

初めに

前回の記事では、OCI電子メール配信サービスの概要を紹介しました。今回は、Autonomous AI Database (ADB) からこのサービスを活用してメールを送信する方法について解説します。

Send mail from Autonomous DB using OCI Email Delivery

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

1. 事前準備

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

東京リージョン:smtp.email.ap-tokyo-1.oci.oraclecloud.com
コンソールで情報を取得できます(電子メール配信 → 構成)。
Get SMTP connection endpoint
他リージョンは、SMTP接続の構成を参照してください。

1-2. 新しいDBユーザーを作成 (ADB - 管理者)

ADB管理者ユーザー(ADMIN)で簡易な検証のみ行う場合は、この手順をスキップしても構いません。

ただし、「ADMIN」ではなく、メール送信専用のユーザーを別途作成することをお勧めします。
その場合は、管理者ユーザーで ADB に接続し、以下のコマンドを実行してユーザーを作成し、必要な権限を付与してください。

-- 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" ;

1-3. プライベートサブネット内のADBを利用する場合

SMTP接続エンドポイントに通信するには、OCIネットワークの下記箇所が正しく設定ていることをご確認ください。

ルート・テーブル
プライベートサブネットに紐づいているルート・テーブルに「NATゲートウェイ」または「サービス・ゲートウェイ」を追加します。
Route rules

エグレス・ルール (Egress Rule)
セキュリティ・リスト (または NSG) でTCP ポート587が許可されていることを確認します。

2. SMTP資格証明を生成 (Console)

電子メール配信を介した電子メール送信のためには、Simple Mail Transfer Protocol (SMTP)の資格証明が必要です。セキュリティのベストプラクティスは、すでに権限が割り当てられているユーザーではなく、新規ユーザーに対してSMTP資格証明を生成することです。

SMTP資格証明の作成方法については、以下の手順をご参照ください。
OCI Email Deliveryでメールを送信するクイック・スタート - STEP 1

3. ポリシーを作成 (Console)

新しいOCIユーザーには、email-familyリソースを管理する権限が必要です。テナンシ管理者としてログインし、以下の手順を参考にポリシーを作成してください。
OCI Email Deliveryでメールを送信するクイック・スタート - STEP 2

ステートメント: Allow group to manage email-family in compartment <compartment name>

4. 承認済送信者を作成 (Console)

新しいOCIユーザー(ポリシー付与済み)でログインし、以下の手順に沿って承認済み送信者を作成してください。
OCI Email Deliveryでメールを送信するクイック・スタート - STEP 4

作成後、以下のように送信者の情報を取得できます。

  • a) 電子メール・ドメインをお持ちでない場合:
    電子メール配信 → 承認済送信者Create approved sender
  • b) 電子メール・ドメインをお持ちの場合:
    電子メール配信 → 電子メール・ドメイン → 承認済送信者Check approved senderDKIM署名付きの電子メール・ドメインは必須ではありませんが、強くお勧めします。このテストではこれを使っています。

5. メール送信用ユーザーにSMTPアクセスを許可 (ADB - 管理者)

管理者 (ADMIN) ユーザーで ADB に接続し、次のコマンドを実行します。

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接続エンドポイントsmtp.email.<リージョン識別子>.oci.oraclecloud.com)に置き換えてください。 これは重要です。そうしないと、メールを送信する際にエラーが発生します。
Allow SMTP access for user ADMIN

2. サンプルコードのprincipal_nameの行は、"ADMIN"ユーザーにSMTPアクセスを許可していますが、 専用ユーザーに変更することをお勧めします。このテストでは、新規作成のユーザーEMAILUSERを使っています。

6. メールを送信するPL/SQLプロシージャを作成 (ADB - メール送信用ユーザー)

クレデンシャルの作成
事前にクレデンシャルを作成し、送信用ストアドプロシージャSEND_MAILにユーザー名とパスワードをハードコーディングしないことを推奨します。

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'SMTP_CRED',
    username => '<SMTP credential username>',
    password => '<SMTP credential password>'
  );
END;

変数 username : <SMTP credential username>を実際の文字列で置き換えます (step-2で生成)。
変数 password : <SMTP credential password>を実際の文字列で置き換えます(step-2で生成)。

PL/SQLプロシージャの作成

CREATE OR REPLACE PROCEDURE SEND_MAIL (
  msg_to varchar2,
  msg_subject varchar2,
  msg_text varchar2 ) 
IS

  mail_conn utl_smtp.connection;
  msg_from varchar2(50) := '<Approved Sender>';
  mailhost VARCHAR2(50) := 'smtp.email.ap-tokyo-1.oci.oraclecloud.com';
  connection_open BOOLEAN := FALSE; 
  CRLF CONSTANT VARCHAR2(2) := UTL_TCP.crlf;
BEGIN
  mail_conn := UTL_smtp.open_connection(mailhost, 587);
  connection_open := TRUE; -- Connection is now open
  UTL_SMTP.starttls(mail_conn);
  UTL_SMTP.SET_CREDENTIAL(mail_conn, 'SMTP_CRED', 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(CURRENT_DATE, 'DD-MM-YYYY HH24:MI:SS') || CRLF);
  UTL_SMTP.write_data(mail_conn, 'To: ' || msg_to || CRLF);
  UTL_SMTP.write_data(mail_conn, 'From: ' || msg_from || CRLF);
  UTL_SMTP.write_data(mail_conn, 'Subject: ' || msg_subject || CRLF);
  UTL_SMTP.write_data(mail_conn, 'Reply-To: ' || msg_to || CRLF || CRLF);
  UTL_SMTP.write_data(mail_conn, msg_text || CRLF || CRLF);
  
  UTL_SMTP.close_data(mail_conn);
  UTL_SMTP.quit(mail_conn);

EXCEPTION
  WHEN UTL_SMTP.transient_error OR UTL_SMTP.permanent_error THEN
    dbms_output.put_line('SMTP Error: ' || SQLERRM);
  WHEN OTHERS THEN
    dbms_output.put_line('Unexpected Error: ' || SQLERRM);
  -- Common cleanup logic for all exceptions
  IF connection_open THEN
    BEGIN
      UTL_SMTP.close_data(mail_conn);
      UTL_SMTP.quit(mail_conn);
    EXCEPTION
      WHEN OTHERS THEN
        dbms_output.put_line('Error closing SMTP connection: ' || SQLERRM);  -- Handle errors during cleanup
    END;
  END IF;
END;
/

出力結果:Procedure SEND_MAIL compiled

変数 msg_from : <Approved Sender>を実際の文字列で置き換えます(step-4で作成)。
変数 mailhost : 他のリージョンを使用する場合は変更してください。

7. テストメールを送信 (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.

受信者には次のようなメールが届きます。
Test mail is received

電子メール配信では、2MBまでのメッセージ(メッセージ・ヘッダー、本文およびアタッチメントを含む)がサポートされています。送信ドメインにSPFおよびDKIMを設定してある場合は、要件に基づいて、この制限の引上げをリクエストできます。リクエストできる最大サイズは60MBです。

以上

公式ドキュメント
Autonomous Databaseでの電子メールの送信

タイトルとURLをコピーしました