はじめに
Oracle Autonomous AI Database(ADB) には、データベースの内部でAI Agentを構築・実行できる「Select AI Agent」という機能があります。
この機能の大きな利点は、AI専用の基盤を用意することなくデータもAI Agentも単一の基盤で利用できることです。これにより、データの移動を最小限に抑え、DBのセキュリティやガバナンスを維持したまま企業データを活用でき、生成AIを業務システムへ安全に組み込みやすくなります。
以前、この機能を使ってDB上のデータを参照した結果をメールで送信するAgentを作成しました。
この時は「組み込みのメール送信ツール」を使ってメール送信を実施しました。しかし、組み込みのツールではツール内に送信先のメールアドレスを埋め込む必要があり、宛先のカスタマイズ性が少し物足りませんでした。
そこで今回はこのSelect AI Agentのツールを自作し、動的に宛先を変更可能なツールとしてAgentに利用させてみたいと思います。
この記事でやること
- メール送信Agentの作成と実行
- 組み込みツールでもメールは送れますが、よりカスタマイズ性の高いAgent Toolにするため、これを置き換えるToolを作成し、このツールを使ってメールを送るAgentを作成しメール送信を実行します。
前提
-
Autonomous AI Databaseのインスタンス構築が完了している
ADBの構築はこちらの手順を参照し実施してください。 -
Select AIを利用するための準備が完了している。
こちらの記事のStep2「ADBへのAPIキーの登録」までを実施してください。 -
SMTPの設定
メールの送信にはSMTPの設定が必要です。こちらの記事の「ADBからのメール送信の設定」の項を参考に構成してください。
加えてEMAIL送信のためのSMTPのクレデンシャルも必要になるため、あらかじめ作成をしておきましょう。
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'EMAIL_CRED',
username => '<SMTP username>',
password => '<SMTP password>');
END;
/
メール送信ツールの作成
早速メール送信ツールを作成していきます。作成とはいっても公式に提供されているPL/SQLプロシージャの機能を拡張するだけです。
send_email_notificationというプロシージャを作ります。
このプロシージャの中でOracle提供のこちらのプロシージャがメールの受信者と件名、内容が動的に変更なようにカスタマイズします。
CREATE OR REPLACE PROCEDURE send_email_notification (
-- 送信先メールアドレス
p_recipient IN VARCHAR2,
-- メール件名
p_subject IN VARCHAR2,
-- メール本文
p_body IN VARCHAR2
)
AS
BEGIN
-- DBMS_CLOUD_NOTIFICATION を使ってメールを送信する
DBMS_CLOUD_NOTIFICATION.SEND_MESSAGE(
-- 通知プロバイダとして email を指定
provider => 'email',
-- メール送信用のCredential名
-- 事前に作成したCredential名に置き換える
credential_name => 'EMAIL_CRED',
-- メール本文
-- subjectではなくbodyを渡す
message => p_body,
-- email providerに渡す追加パラメータ
params => json_object(
-- 宛先メールアドレス
'recipient' value p_recipient,
-- メール件名
'subject' value p_subject,
-- OCI Email DeliveryのSMTPエンドポイント
-- 利用リージョンに合わせて変更する
'smtp_host' value 'smtp.email.eu-milan-1.oci.oraclecloud.com',
-- 送信元メールアドレス
-- Approved Senderとして登録済みのアドレスに変更する
'sender' value 'your_sender@gmail.com'
)
);
-- 正常終了時のログ出力
DBMS_OUTPUT.PUT_LINE('Email sent to: ' || p_recipient);
EXCEPTION
-- 何らかのエラーが発生した場合の処理
WHEN OTHERS THEN
-- エラーメッセージをログ出力
DBMS_OUTPUT.PUT_LINE('Error sending email: ' || SQLERRM);
-- エラーを呼び出し元に再送出する
-- Agent Tool側にも失敗として伝えるため
RAISE;
-- プロシージャの終了
END send_email_notification;
/
プロシージャが完成したらテストしてみましょう
作成したsend_email_notificationプロシージャを実行します。
BEGIN
send_email_notification(
p_recipient => '送信先のメールアドレス',
p_subject => 'Test Mail',
p_body => 'This is a test email from DBMS_CLOUD_NOTIFICATION.'
);
END;
/

きちんと私のGmail宛にメールが飛んでいました。
プロシージャ自体は作成完了です。
作成したプロシージャをAgent Tool化する
それではこのPL/SQLプロシージャをAgent Toolにしていきます。
Agent ToolはDBMS_CLOUD_AI_AGENTパッケージのCREATE_TOOLプロシージャで作成できます。(参考)
-- 既存がある場合は削除
BEGIN
DBMS_CLOUD_AI_AGENT.DROP_TASK(
task_name => 'DYNAMIC_MAIL_TASK'
);
END;
/
-- 作成
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
-- tool名は好きにつけてください。
tool_name => 'DYNAMIC_MAIL_TOOL',
-- attributesにツールの情報を入力します。
-- instructionはLLMに送信するツールの定義情報のためきちんと書きましょう。
-- function に先ほど作成したプロシージャを指定します。
-- tool_params にプロシージャの引数を定義しておきます。
attributes => '{
"instruction": "指定された宛先にメールを送信するツールです。p_recipientには送信先メールアドレス、p_subjectには短い件名、p_bodyにはメール本文を入力してください。",
"function" : "send_email_notification",
"tool_params": {
"p_recipient": "送信先メールアドレス",
"p_subject": "メール件名。短く端的に入力すること。",
"p_body": "メール本文"
}
}',
description => '動的に送信先を変更してメール送信するツール'
);
END;
/
一応作成できたツールを確認してみましょう。
SQL>SELECT
tool_id,
tool_name,
status,
description,
created,
last_modified
FROM user_ai_agent_tools
WHERE tool_name = 'DYNAMIC_MAIL_TOOL';
TOOL_ID TOOL_NAME STATUS DESCRIPTION CREATED LAST_MODIFIED
---------- ------------------ -------- ---------------------------------------- -------------------------------------------- --------------------------------------------
7 DYNAMIC_MAIL_TOOL ENABLED 動的に送信先を変更してメール送信するツール 22-MAY-26 03.19.02.950815000 PM ASIA/TOKYO 22-MAY-26 03.19.02.950815000 PM ASIA/TOKYO
これにてAgentが使うツールの作成が完了しました。
Agentの作成
ここまでできたら、あとは組み込みツールでAgentを作成する時と同じです。
Agentの作成Stepは以下になります。
| Step | 内容 |
|---|---|
| 1. Agent Toolの作成 | Agentに使用させるツールを定義します。組み込み済みのSQLツールを使用します。 |
| 2. Taskの作成 | Agentが実行するタスクを定義します。何をどのツールで処理するのかを指定するイメージです。 |
| 3. Agentの作成 | AgentにAIプロファイルと役割を設定します。 |
| 4. Agent Teamの作成 | どのAgentがどのタスクをどういう順で実施するのかを定義します。 |
| 5. 有効化 | Agent Teamが動作するできるように有効化します。 |
Toolは先ほど作ったのでTaskを作成し、このDYNAMIC_MAIL_TOOLを呼び出すAgentを作成します。
まずはメール送信だけを試す最小構成でいきましょう。
Agent Taskの作成
Taskの作成には先ほど同様にDBMS_CLOUD_AI_AGENTパッケージのCREATE_TASKプロシージャを利用します。
-- 既存がある場合は削除
BEGIN
DBMS_CLOUD_AI_AGENT.DROP_TOOL(
tool_name => 'DYNAMIC_MAIL_TOOL'
);
END;
/
-- 作成
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name => 'DYNAMIC_MAIL_TASK',
attributes => '{
"instruction": "ユーザーから送信先メールアドレス、件名、本文を受け取り、
DYNAMIC_MAIL_TOOLを使ってメールを送信してください。
p_recipientには送信先メールアドレス、p_subjectには短く端的な件名、
p_bodyにはメール本文を指定してください。
メール送信後、使用した送信先メールアドレスをユーザーに伝えてください。",
"tools": ["DYNAMIC_MAIL_TOOL"],
"enable_human_tool": "true"
}',
description => '動的な宛先にメールを送信するTask'
);
END;
/
作成したら確認します。
SELECT
task_id,
task_name,
status,
description,
created,
last_modified
FROM user_ai_agent_tasks
WHERE task_name = 'DYNAMIC_MAIL_TASK';
TASK_ID TASK_NAME STATUS DESCRIPTION CREATED LAST_MODIFIED
---------- ------------------ -------- ------------------------------- -------------------------------------------- --------------------------------------------
10 DYNAMIC_MAIL_TASK ENABLED 動的な宛先にメールを送信するTask 22-MAY-26 03.34.11.376540000 PM ASIA/TOKYO 22-MAY-26 03.34.11.376540000 PM ASIA/TOKYO
Agentの作成
Agentを作成します。
AgentはLLMを使うので、プロファイルが必要です。
まずはプロファイルを作ります。
プロファイルの作成
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'DYNAMIC_MAIL_AGENT_PROFILE',
attributes => '{
"provider": "oci",
"credential_name": "OCI_CRED",
"region": "us-ashburn-1",
"model": "xai.grok-4"
}',
description => 'AI profile for Dynamic Mail Agent'
);
END;
Agent作成
次にAgentを作成します。LLMが正しく動作するようにroleはしっかりと記載しましょう。
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
agent_name => 'DYNAMIC_MAIL_AGENT',
attributes => '{
"profile_name": "DYNAMIC_MAIL_AGENT_PROFILE",
"role": "あなたはメール送信を支援するエージェントです。
ユーザーから送信先メールアドレス、件名、本文を確認し、
DYNAMIC_MAIL_TASKを実行してメールを送信してください。
メール送信後、使用した送信先メールアドレスをユーザーに伝えてください。",
"enable_human_tool": "true"
}',
description => '動的な宛先にメールを送信するAgent'
);
END;
/
できたら確認します。
SELECT
agent_id,
agent_name,
status,
description,
created,
last_modified
FROM user_ai_agents
WHERE agent_name = 'DYNAMIC_MAIL_AGENT';
AGENT_ID AGENT_NAME STATUS DESCRIPTION CREATED LAST_MODIFIED
---------- -------------------- -------- -------------------------------- -------------------------------------------- --------------------------------------------
10 DYNAMIC_MAIL_AGENT ENABLED 動的な宛先にメールを送信するAgent 22-MAY-26 03.59.57.285886000 PM ASIA/TOKYO 22-MAY-26 03.59.57.285886000 PM ASIA/TOKYO
Agent Teamの作成
最後にAgent Teamを作成します。
ここまでで作成した、AgentとTaskを指定します。
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TEAM(
team_name => 'DYNAMIC_MAIL_TEAM',
attributes => '{
"agents": [
{
"name": "DYNAMIC_MAIL_AGENT",
"task": "DYNAMIC_MAIL_TASK"
}
],
"process": "sequential"
}',
description => '動的な宛先にメールを送信するTeam'
);
END;
/
できたら確認してみましょう。
SELECT
team_id,
status,
description,
created,
last_modified
FROM user_ai_agent_teams
WHERE team_name = 'DYNAMIC_MAIL_TEAM';
AGENT_TEAM_ID AGENT_TEAM_NAME STATUS DESCRIPTION CREATED LAST_MODIFIED
---------------- ------------------- -------- ------------------------------- -------------------------------------------- --------------------------------------------
15 DYNAMIC_MAIL_TEAM ENABLED 動的な宛先にメールを送信するTeam 22-MAY-26 04.09.57.113645000 PM ASIA/TOKYO 22-MAY-26 04.09.57.113645000 PM ASIA/TOKYO
Agentからメールを送ってみよう
まずは作成したAgent Teamを有効化します。
EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('DYNAMIC_MAIL_TEAM');
それではAgentからメールを送ってみましょう。
SQL> SELECT AI AGENT
'xxx@gmail.com 宛に、件名「テスト」、本文「お疲れ様でした」でメールを送信してください。';
RESPONSE
________________________________________________
The email was sent to xxx@gmail.com.

私のメールアドレス宛にメールがきちんと届きました。
お疲れ様でしただけでは少し心に響きません。もう少し労ってもらいたいと思います。
SQL> SELECT AI AGENT
'xxx@gmail.com 宛に、件名「テスト」、本文は私の環境構築への労いの言葉を考えて
メールを送信してください。';
RESPONSE
________________________________________________
The email was sent to xxx@gmail.com.
まとめ
今回はメール送信用のAgent Toolを自作し、それを使ってIn-Database Agentからのメール送信を試してみました。
これなら、宛先を固定することなくプロンプトで指定したり、DBから取得した情報をもとにメールを送ると言ったことが可能です。
次回はDB検索用のAgentと今回のメール送信Agentを組み合わせて、
- DBからメールアドレスを取得
- DBの情報をもとにメール本文を作成
- メールを送信
を実装してみたいと思います。
