Autonomous Databaseでの電子メールの送信

Autonomous Databaseには、電子メールを送信するためのオプションが多数あります。テキスト・メッセージまたはSQL問合せの出力をSlackまたはMSTeamsチャネルに送信することもできます。

Autonomous Databaseでの電子メール配信サービスによる電子メールの送信

UTL_SMTPを使用してAutonomous Databaseに送信するステップについて説明します。

ノート

Oracle Cloud Infrastructure Email Delivery Serviceは、パブリックSMTPエンドポイントでサポートされている唯一の電子メール・プロバイダです。

Oracle Cloud Infrastructure Email Delivery Serviceに電子メールを送信するには:

  1. 電子メール配信用のSMTP接続エンドポイントを指定します。現在のリージョンで電子メール配信を使用できない場合は、追加のOracle Cloud Infrastructureリージョンをサブスクライブする必要がある可能性があります。

    たとえば、SMTP接続エンドポイントに次のいずれかを選択します:

    • smtp.us-phoenix-1.oraclecloud.com
    • smtp.us-ashburn-1.oraclecloud.com
    • smtp.email.uk-london-1.oci.oraclecloud.com
    • smtp.email.eu-frankfurt-1.oci.oraclecloud.com
    ノート

    SMTP接続エンドポイントがAutonomous Databaseとは異なるリージョンにある場合は、Oracle Cloud Supportでリクエストを作成して、クラウド操作でそのリージョンのEmail DeliveryサービスをAutonomous Databaseに対して有効にする必要があります。

    詳細は、SMTP接続の構成を参照してください。

  2. 電子メール配信用のSMTP資格証明を生成します。電子メールを送信すると、UTL_SMTPによって資格証明を使用して電子メール配信サーバーでの認証が行われます。

    詳細は、ユーザーに対するSMTP資格証明の生成を参照してください。

  3. 電子メール配信の承認済送信者を作成します。UTL_SMTP.MAILFromとして使用するすべての電子メール・アドレスに対して、このステップを実行します。

    詳細は、承認済送信者の管理を参照してください。

  4. アクセス制御エントリ(ACE)を追加して、ADMINユーザーのSMTPアクセスを許可します。

    たとえば:

    BEGIN
      -- Allow SMTP access for user ADMIN
      DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => ’www.us.example.com’,
        lower_port => 587,
        upper_port => 587,
        ace => xs$ace_type(privilege_list => xs$name_list('SMTP'),
                           principal_name => 'ADMIN',
                           principal_type => xs_acl.ptype_db));
    END;
    /
  5. 電子メールを送信するPL/SQLプロシージャを作成します。

    たとえば、SMTP電子メール送信サンプル・コードに示されたサンプル・コードを参照してください。

  6. ステップ5で作成したPL/SQLプロシージャを使用して、テスト電子メールを送信します。

    たとえば:

    execute send_mail('taylor@example.com', 'Email from Oracle Autonomous Database', 'Sent using UTL_SMTP');

UTL_SMTPの詳細は、UTL_SMTPを参照してください。

Autonomous DatabaseでのUTL_SMTPの制限については、PL/SQLパッケージ・ノートAutonomous Databaseを参照してください。

SMTP電子メール送信のサンプル・コード

Autonomous Database上でUTL_SMTPを使用して電子メールを送信するためのサンプル・コードを示します。

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

  mail_conn utl_smtp.connection;
  username varchar2(1000):= 'ocid1.user.oc1.username';
  passwd varchar2(50):= 'password';
  msg_from varchar2(50) := 'adam@example.com';
  mailhost VARCHAR2(50) := 'smtp.us-ashburn-1.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;
/

説明:

プライベート・エンドポイントでのEメール・プロバイダによるEメールの送信

プライベート・エンドポイントにある電子メール・プロバイダを使用して電子メールを送信するステップについて説明します。

プライベート・エンドポイントでのEメール・プロバイダを使用してAutonomous DatabaseからEメールを送信するには、Oracle Cloud Infrastructure VCN (Autonomous Databaseインスタンスのプライベート・エンドポイント)からEメール・プロバイダにアクセスできる必要があります。たとえば:

  • ソースAutonomous Databaseインスタンスと電子メール・プロバイダの両方が同じOracle Cloud Infrastructure VCN内にあります。

  • ソースAutonomous Databaseインスタンスと電子メール・プロバイダは、ペアになっている別のOracle Cloud Infrastructure VCNにあります。

  • 電子メール・プロバイダは、FastConnectまたはVPNを使用してソースAutonomous DatabaseインスタンスのOracle Cloud Infrastructure VCNに接続されているオンプレミス・ネットワーク上にあります。

前提条件として、電子メール・プロバイダを使用して電子メールを送信するには、次のイングレスおよびエグレス・ルールを定義します:

  • ターゲット・ホストへのトラフィックが(使用しているポートに応じて)ポート587またはポート25で許可されるように、ソース・データベースのサブネット・セキュリティ・リストまたはネットワーク・セキュリティ・グループにエグレス・ルールを定義します。

  • ソースAutonomous DatabaseインスタンスのIPアドレスからポート587またはポート25へのトラフィックが(使用しているポートに応じて)許可されるように、ターゲット・ホストのサブネット・セキュリティ・リストまたはネットワーク・セキュリティ・グループにイングレス・ルールを定義します。

プライベート・エンドポイントでの電子メール・プロバイダから電子メールを送信するには:

  1. アクセス制御エントリ(ACE)を追加して、ADMINユーザーのSMTPアクセスを許可します。

    次に例を示します。

    -- Create an Access Control List for the host
    BEGIN
       DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
             host => 'www.example.com',
             lower_port => 587,
             upper_port => 587,
             ace => xs$ace_type(privilege_list => xs$name_list('SMTP'),
                                 principal_name => 'ADMIN',
                                 principal_type => xs_acl.ptype_db),
             private_target => TRUE);
    END;
    /
    ノート

    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACEでは、hostパラメータに対して1つのホスト名のみがサポートされます(プライベート・エンドポイントでは、IPアドレス、SCAN IPまたはSCANホスト名はサポートされていません)。

    ROUTE_OUTBOUND_CONNECTIONSPRIVATE_ENDPOINTに設定した場合、このAPIではprivate_targetパラメータをTRUEに設定する必要はありません。詳細は、プライベート・エンドポイントを使用したアウトバウンド接続のセキュリティの強化を参照してください。

  2. 電子メールを送信するPL/SQLプロシージャを作成します。
  3. ステップ2で作成したPL/SQLプロシージャを使用して、テスト電子メールを送信します。

    次に例を示します。

    execute send_mail('taylor@example.com', 'Email from Oracle Autonomous Database', 'Sent using private email provider');

資格証明オブジェクトを使用したSMTP認証の設定

資格証明オブジェクトをUTL_SMTP.SET_CREDENTIAL APIに渡す方法について説明します。

SET_CREDENTIALサブプログラムは、AUTHコマンドを送信して、SMTPサーバーに対する認証を行います。

UTL_SMTP.SET_CREDENTIALサブプログラムを使用すると、資格証明オブジェクトを渡してSMTP認証を設定できます。資格証明オブジェクトはスキーマ・オブジェクトであるため、アクセスできるのは特権ユーザーのみで、資格証明を制御するためのスキーマ・レベルの権限を構成できます。資格証明オブジェクトを渡すことは、認証用のユーザー名/パスワード/キーを格納および管理するための適切でセキュアな方法です。

UTL_SMTP.SET_CREDENTIALサブプログラムは、UTL_SMTP.AUTHサブプログラムに代わる安全で便利な方法です。


...
UTL_SMTP.AUTH (l_mail_conn, 'ocid1.user.oc1.username', 'xxxxxxxxxxxx', schemes => 'PLAIN');
...

前述の例に示すように、AUTHサブプログラムを起動する場合は、PL/SQL仮パラメータの一部としてクリア・テキストでユーザー名/パスワードを渡す必要があります。様々なPL/SQL自動化またはcronスクリプトにユーザー名/パスワードを埋め込む必要がある場合があります。クリア・テキスト・パスワードの受渡しは、UTL_SMTP.SET_CREDENTIALサブプログラムで対処されるコンプライアンスの問題です。

詳細は、AUTHファンクションおよびプロシージャを参照してください。

UTL_SMTP.SET_CREDENTIAL構文

PROCEDURE UTL_SMTP.SET_CREDENTIAL (
    c          IN OUT NOCOPY connection,
    credential IN            VARCHAR2,
    schemes    IN            VARCHAR2 DEFAULT NON_CLEARTEXT_PASSWORD_SCHEMES
);

FUNCTION UTL_SMTP.SET_CREDENTIAL (
    c          IN OUT NOCOPY connection,
    credential IN            VARCHAR2,
    schemes    IN            VARCHAR2 DEFAULT NON_CLEARTEXT_PASSWORD_SCHEMES)
    RETURN reply;

  • 資格証明オブジェクトの作成:

    BEGIN DBMS_CLOUD.CREATE_CREDENTIAL (
        credential_name => 'HTTP_CRED',
        username        => 'web_app_user',
        password        => '<password>' );
    END;

    これにより、ユーザー名/パスワードのペアを格納する資格証明オブジェクトが作成されます。

    詳細は、CREATE_CREDENTIALプロシージャを参照してください。

    詳細は、「スケジューラ・ジョブの資格証明の指定」を参照してください。

  • UTL_SMTP.SET_CREDENTIALプロシージャを実行します。

    DECLARE
          l_mail_conn UTL_SMTP.CONNECTION;
        BEGIN 
          l_mail_conn := UTL_SMTP.OPEN_CONNECTION('smtp.example.com', 587);
          UTL_SMTP.SET_CREDENTIAL(l_mail_conn, 'SMTP_CRED', SCHEMES => 'PLAIN');
          ...
    END;
    

    この例では、コマンドを送信して、SMTPサーバーに対する認証を行います。Webサーバーが要求を認証するにはこの情報が必要です。値l_mail_connはSMTP接続、SMTP_CREDは資格証明名、PLAINはSMTP認証スキームです。

詳細は、UTL_SMTPを参照してください。

Autonomous DatabaseでのUTL_SMTPの制限の詳細は、PL/SQLパッケージ・ノートAutonomous Databaseを参照してください。

DBMS_CLOUD_NOTIFICATIONを使用したAutonomous Databaseからの電子メールの送信

DBMS_CLOUD_NOTIFICATIONパッケージを使用して、メッセージおよび問合せ結果を電子メールとして送信します。

ノート

DBMS_CLOUD_NOTIFICATIONでは、パブリックSMTPエンドポイントにのみ電子メールを送信できます。Oracle Cloud Infrastructure Email Delivery Serviceは、サポートされている唯一の電子メール・プロバイダです。

Autonomous Databaseからの電子メールとしてのメッセージの送信

DBMS_CLOUD_NOTIFICATIONを使用して、メッセージを電子メールとして送信できます。
  1. 電子メール配信用のSMTP接続エンドポイントを指定します。現在のリージョンで電子メール配信を使用できない場合は、追加のOracle Cloud Infrastructureリージョンをサブスクライブする必要がある可能性があります。

    たとえば、SMTP接続エンドポイントに次のいずれかを選択します:

    • smtp.us-phoenix-1.oraclecloud.com
    • smtp.us-ashburn-1.oraclecloud.com
    • smtp.email.uk-london-1.oci.oraclecloud.com
    • smtp.email.eu-frankfurt-1.oci.oraclecloud.com

    詳細は、SMTP接続の構成を参照してください。

  2. 電子メール配信用のSMTP資格証明を生成します。電子メールを送信すると、UTL_SMTPによって資格証明を使用して電子メール配信サーバーでの認証が行われます。

    詳細は、ユーザーに対するSMTP資格証明の生成を参照してください。

  3. 電子メール配信の承認済送信者を作成します。UTL_SMTP.MAILFromとして使用するすべての電子メール・アドレスに対して、このステップを実行します。

    詳細は、承認済送信者の管理を参照してください。

  4. アクセス制御エントリ(ACE)を追加して、ADMINユーザーのSMTPアクセスを許可します。

    次に例を示します。

    BEGIN
      -- Allow SMTP access for user ADMIN
      DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => ’www.us.example.com’,
        lower_port => 587,
        upper_port => 587,
        ace => xs$ace_type(privilege_list => xs$name_list('SMTP'),
                           principal_name => 'ADMIN',
                           principal_type => xs_acl.ptype_db));
    END;
    /
  5. 資格証明オブジェクトを作成し、DBMS_CLOUD_NOTIFICATION.SEND_MESSAGEを使用してメッセージを電子メールとして送信します。
    BEGIN
       DBMS_CLOUD.CREATE_CREDENTIAL(
            credential_name => 'EMAIL_CRED',
            username        => 'username',
            password        => 'password'
       );
       END;
    /
    BEGIN
       DBMS_CLOUD_NOTIFICATION.SEND_MESSAGE(
            provider        => 'email',
            credential_name => 'EMAIL_CRED',
            message         => 'Subject content',
            params          => json_object('recipient' value  'mark@example.com, suresh@example.com',
                                           'to_cc'  value 'nicole@example.com, jordan@example.com',
                                           'to_bcc' value 'manisha@example.com',
                                           'subject' value 'Test subject',
                                           'smtp_host' value 'smtp.email.example.com',
                                           'sender'    value  'approver_sender@example.com' )
       );
       END;
    /

    paramsパラメータでは、string値にCCまたはBCCの送信者、smtp_host、件名、受信者および受信者を指定します。

    • sender: ステップ3の承認済送信者の電子メールIDを指定します。

    • smtp_host: ステップ2のSMTPホスト名を指定します。

    • subject: 電子メールの件名を指定します。

    • recipient: 受信者の電子メールIDを指定します。複数の受信者がいる場合は、電子メールIDの間にカンマを使用します。

    • to_cc: 電子メールのCCを受信する電子メールIDを指定します。複数のCC受信者がいる場合は、EメールIDの間にカンマを使用します。

    • to_bcc: 電子メールのBCCを受信する電子メールIDを指定します。複数のBCC受信者がいる場合は、電子メールIDの間にカンマを使用します。

    詳細は、SEND_MESSAGEプロシージャを参照してください。

Autonomous Databaseからの問合せ結果を電子メールとして送信

DBMS_CLOUD_NOTIFICATIONパッケージを使用して、問合せの結果を電子メールとして送信できます。

DBMS_CLOUD_NOTIFICATIONを使用してメールを送信するには:

  1. 電子メール配信用のSMTP接続エンドポイントを指定します。現在のリージョンで電子メール配信を使用できない場合は、追加のOracle Cloud Infrastructureリージョンをサブスクライブする必要がある可能性があります。

    たとえば、SMTP接続エンドポイントに次のいずれかを選択します:

    • smtp.us-phoenix-1.oraclecloud.com
    • smtp.us-ashburn-1.oraclecloud.com
    • smtp.email.uk-london-1.oci.oraclecloud.com
    • smtp.email.eu-frankfurt-1.oci.oraclecloud.com

    詳細は、SMTP接続の構成を参照してください。

  2. 電子メール配信用のSMTP資格証明を生成します。電子メールを送信すると、UTL_SMTPによって資格証明を使用して電子メール配信サーバーでの認証が行われます。

    詳細は、ユーザーに対するSMTP資格証明の生成を参照してください。

  3. 電子メール配信の承認済送信者を作成します。UTL_SMTP.MAILFromとして使用するすべての電子メール・アドレスに対して、このステップを実行します。

    詳細は、承認済送信者の管理を参照してください。

  4. アクセス制御エントリ(ACE)を追加して、ADMINユーザーのSMTPアクセスを許可します。

    次に例を示します。

    BEGIN
      -- Allow SMTP access for user ADMIN
      DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => ’www.us.example.com’,
        lower_port => 587,
        upper_port => 587,
        ace => xs$ace_type(privilege_list => xs$name_list('SMTP'),
                           principal_name => 'ADMIN',
                           principal_type => xs_acl.ptype_db));
    END;
    /
  5. 資格証明オブジェクトを作成し、DBMS_CLOUD_NOTIFICATION.SEND_DATAを使用して問合せの出力を電子メールとして送信します。
    BEGIN
       DBMS_CLOUD.CREATE_CREDENTIAL(
            credential_name => 'EMAIL_CRED',
            username        => 'username',
            password        => 'password'
       );
       END;
    /
    BEGIN
       DBMS_CLOUD_NOTIFICATION.SEND_DATA(
            provider        => 'email',
            credential_name => 'EMAIL_CRED',
            query           => 'SELECT tablespace_name FROM dba_tablespaces',
            params          => json_object('recipient' value  'mark@example.com, suresh@example.com',
                                           'to_cc'  value 'nicole@example.com1, jordan@example.com',
                                           'to_bcc' value 'manisha@example.com',
                                           'subject' value 'Test subject',
                                           'type' value 'json',
                                           'title' value 'mytitle',
                                           'message' value 'This is the message',
                                           'smtp_host' value 'smtp.email.example.com',
                                           'sender'    value  'approver_sender@example.com' )
       );
       END;
    /
    paramsパラメータでは、送信者、smtp_host、件名、受信者、CCまたはBCCの受信者、メッセージ、データ型およびタイトルをString値で指定します。
    • sender: ステップ3の承認済送信者の電子メールIDを指定します。

    • smtp_host: ステップ2のSMTPホスト名を指定します。

    • subject: 電子メールの件名を指定します。最大サイズは100文字です。

    • 受信者: 受信者の電子メールIDを指定します。複数の受信者がいる場合は、電子メールIDの間にカンマを使用します。

    • to_cc: 電子メールのCCを受信する電子メールIDを指定します。複数のCC受信者がいる場合は、EメールIDの間にカンマを使用します。

    • to_bcc: 電子メールのBCCを受信する電子メールIDを指定します。複数のBCC受信者がいる場合は、電子メールIDの間にカンマを使用します。

    • message: メッセージ・テキストを指定します。

    • type: 出力形式をCSVまたはJSONとして指定します。

    • title: SQL出力の添付のタイトルを指定します。タイトルには、ファイル名の生成に使用されるため、文字、数字、アンダースコア、ハイフンまたはドットのみをその値に含める必要があります。

    問合せの結果をメールとして送信するためのノート:

    • DBMS_CLOUD_NOTIFICATIONは、Autonomous Databaseバージョン19.21以上のメール通知にのみ使用できます。

    • メール通知のDBMS_CLOUD_NOTIFICATION.SEND_DATAで使用する最大メッセージ・サイズは、32kバイトです。

    詳細は、SEND_DATAプロシージャを参照してください。