初めに
前回の記事では、OCI電子メール配信サービスの概要を紹介しました。今回は、Autonomous AI Database (ADB) からこのサービスを活用してメールを送信する方法について解説します。
検証環境
リージョン:東京
ワークロード・タイプ:Data Warehouse (19c)
アクセス・タイプ: (下記両方は動作確認済)
✅ すべての場所からのセキュア・アクセスを許可
✅ VCN (プライベート・エンドポイント)
1. 事前準備
1-1. SMTP接続エンドポイントを取得 (Console)
東京リージョン:smtp.email.ap-tokyo-1.oci.oraclecloud.com
コンソールで情報を取得できます(電子メール配信 → 構成)。
他リージョンは、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ゲートウェイ」または「サービス・ゲートウェイ」を追加します。
エグレス・ルール (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) 電子メール・ドメインをお持ちでない場合:
電子メール配信 → 承認済送信者
- b) 電子メール・ドメインをお持ちの場合:
電子メール配信 → 電子メール・ドメイン → 承認済送信者
DKIM署名付きの電子メール・ドメインは必須ではありませんが、強くお勧めします。このテストではこれを使っています。
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)に置き換えてください。 これは重要です。そうしないと、メールを送信する際にエラーが発生します。
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.
受信者には次のようなメールが届きます。
以上
公式ドキュメント
Autonomous Databaseでの電子メールの送信