専用Exadata Infrastructure上のAutonomous Databaseでの電子メールの送信

電子メール配信サービスまたはDBMS_CLOUD_NOTIFICATIONプロシージャを使用して、専用Exadataインフラストラクチャ上のAutonomous Databaseで電子メールを送信できます。この記事では、これらの両方のオプションを使用して電子メールを送信する方法について説明します。

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

UTL_SMTPを使用してAutonomous Database on Dedicated Exadata Infrastructureで電子メールを送信するステップについて説明します。

UTL_SMTPを使用して電子メールを送信するには:
  1. 電子メール配信用のSMTP接続エンドポイントを指定します。
    1. Oracle Cloud Infrastructure (OCI) Email Deliveryサービスを使用する場合は、電子メール配信用の接続エンドポイントを指定します。たとえば、米国西部(フェニックス)が送信元リージョンの場合は、smtp.email.US-phoenix-1.oci.oraclecloud.comを選択します。詳細は、SMTP接続の構成を参照してください。
      ノート

      現在のリージョンで電子メール配信が使用できない場合は、追加のOracle Cloud Infrastructureリージョンをサブスクライブする必要があることがあります。
    2. サードパーティのSMTPサーバーを使用する場合は、ネットワーク管理者がSMTPサーバーおよびそれとAutonomous Databaseテナントとの接続を構成し、SMTP接続エンドポイント情報を指定する必要があります。
  2. OCIユーザーの電子メール配信用のSMTP資格証明を生成します。
    電子メールを送信すると、UTL_SMTPにより、資格証明を使用して電子メール配信サーバーでの認証が行われます。詳細は、ユーザーに対するSMTP資格証明の生成を参照してください。
  3. 電子メール配信用の承認済送信者を作成します。
    OCI Email Deliveryサービスを使用している場合は、UTL_SMTP.MAILで「送信元」として使用するすべての電子メール・アドレスについてこのステップを実行します。詳細は、承認済送信者の管理を参照してください。
  4. アクセス制御エントリ(ACE)を追加して、管理者ロールを持つユーザーのSMTPホスト・アクセスを許可します。
    セキュアなSMTPを使用するには、SMTPホスト・アクセスに加えて、ウォレット・アクセス用のアクセス制御エントリ(ACE)を使用してデータベース・ユーザーを設定する必要があります。OCI Email Deliveryサービスを使用してセキュアなSMTPアクセスを行うには、PLAIN、CRAM-MD5、LOGINなどのSimple Authentication and Security Layer (SASL)プロトコルを使用してOracle Cloud Infrastructureアカウントを認証する必要があります。たとえば、SMTP電子メール送信のサンプル・コードのサンプル・コードを参照してください。
  5. UTL_MAILを使用して電子メールを送信するためのPL/SQLコードを記述します。

    ヒント:

    自分で電子メールの送信プロシージャを開発する場合は、コードがSMTP電子メールの送信のサンプル・コードに従っていることを確認してください。
  6. ステップ5で作成したPL/SQLプロシージャを使用して、テスト電子メールを送信します。
    例:
    execute send_mail('taylor@example.com', 'Email from Oracle Autonomous Database', 'Sent using UTL_SMTP');

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

Autonomous DatabaseでのUTL_SMTPの使用の詳細は、データベースPL/SQLパッケージの使用に関するノートを参照してください。

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

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

サンプル・コード

-- As ADMIN user, set up ACE to access SMTP host
connect admin/[password]@[ADBD-host]/[pdbname]_tp.atp.oraclecloud.com
begin
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE (
    host       => '[SMTP_Server_address]',
    lower_port => 25,
    upper_port => 25,
    ace        => xs$ace_type(
                    privilege_list => xs$name_list('smtp'),
                    principal_name => '[database_user]',
                    principal_type => xs_acl.ptype_db));
end;

/
-- If using secure SMTP, set up ACE to wallet for certificate-based secure (TLS) email
declare
  m_wallet_path VARCHAR2(512);
begin
  select property_value into m_wallet_path
    from database_properties
   where property_name like '%SSL%';
  m_wallet_path := 'file:' || m_wallet_path;
  DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE (
    wallet_path => m_wallet_path,
    ace         => xs$ace_type(
                     privilege_list => xs$name_list('use_client_certificates'),
                     principal_name => '[database_user]',
                     principal_type => xs_acl.ptype_db));
end;
/
-- As ADMIN or regular database user with privileges set up above, use UTL_SMTP to send email
connect [database_user]/[password]@[ADBD-host]/[pdbname]_tp.atp.oraclecloud.com

-- Example of normal (non-secure) email
DECLARE
  c         UTL_SMTP.CONNECTION;
  reply     UTL_SMTP.REPLY;
  host      varchar2(64) := '[SMTP_Server_address]',
  port      pls_integer := 25;
  sender    varchar2(64) := '[sender-address@domain.com]';
  recipient varchar2(64) := '[recipient-address@domain.com]';
BEGIN
  c := UTL_SMTP.OPEN_CONNECTION (host, port);
  if (reply.CODE != 220) then
    raise_application_error(-20000,'UTL_SMTP.CONNECTION: '
      || reply.CODE || ' - ' || reply.TEXT);
  end if;

  UTL_SMTP.HELO(c, host);
  UTL_SMTP.MAIL(c, sender);
  UTL_SMTP.RCPT(c, recipient);
  UTL_SMTP.OPEN_DATA(c);
  UTL_SMTP.WRITE_DATA(c,'From:[Sender]  <' || sender || '>'    || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c,'To:[Recipient] <' || recipient || '>' || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c,'Subject: Email from UTL_SMTP App' || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c,'Mail Content');
  UTL_SMTP.CLOSE_DATA(c);
  dbms_output.put_line('Close Data: ' || reply.code);
  UTL_SMTP.QUIT(c);
END;
/

-- Example of secure email using OCI Mail Server as the SMTP server
DECLARE
  m_wallet_path VARCHAR2(256);
  c             UTL_SMTP.CONNECTION;
  reply         UTL_SMTP.REPLY;
  host          varchar2(64) := 'smtp.email.[region].oci.oraclecloud.com';
  port          pls_integer := 25;
  sender        varchar2(64) := '[sender-address@domain.com]';
  recipient     varchar2(64) := '[recipient-address@domain.com]';
BEGIN
  select property_value into m_wallet_path
    from database_properties
   where property_name like '%SSL%';
  m_wallet_path := 'file:' || m_wallet_path;

  -- secure connection with SSL/TLS made *before* SMTP communication
  -- use hostname matched against CN or SMTP server's certificate
  reply := UTL_SMTP.OPEN_CONNECTION (
             host                          => host,
             port                          => port,
             c                             => c,
             wallet_path                   => m_wallet_path,
             wallet_password               => NULL,
             secure_connection_before_smtp => FALSE,
             secure_host                   => NULL);
  if (reply.CODE != 220) then
      raise_application_error(-20000,'UTL_SMTP.OPEN_CONNECTION: '
        || reply.CODE ||' - ' || reply.TEXT);
  end if;

  UTL_SMTP.STARTTLS(c);
 
  -- username is the 'SMTP credential' for the user's email address
  -- obtained from OCI Identity -> Users -> email address.
  -- Scheme refers to SASL (Simple Authentication and Security Layer)
  -- Authentication Schemes for SMTP protocol - PLAIN, CRAM-MD5, LOGIN
  -- https://docs.oracle.com/en-us/iaas/Content/Email/Concepts/overview.htm
  UTL_SMTP.AUTH(
     c        => c,
     username => '[ocid1.user.verylongaddresscreatedinOCIforuseraddress.com]',
     password => '[password-provided-from-create]',
     schemes  => 'PLAIN');

  UTL_SMTP.HELO(c, host);
  UTL_SMTP.MAIL(c, sender);
  UTL_SMTP.RCPT(c, recipient);
  UTL_SMTP.OPEN_DATA(c);
  UTL_SMTP.WRITE_DATA(c, 'From: Sender <' || sender || '>' || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c, 'To: Recipient <' || recipient || '>' || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c, 'Subject: Email from UTL_SMTP App' || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(c, 'Mail Content');
  UTL_SMTP.WRITE_DATA(c, 'Sender is a domain-owned approved sender in OCI Mail Service');
  UTL_SMTP.CLOSE_DATA(c);
  dbms_output.put_line('Close Data: ' || reply.code);
  UTL_SMTP.QUIT(c);
END;
/

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

適用対象: 適用可能 Oracle Public Cloudのみ

DBMS_CLOUD_NOTIFICATIONを使用して、メッセージを電子メールとして送信できます。
ノート

DBMS_CLOUD_NOTIFICATIONは、Autonomous Databaseバージョン19.21以上の電子メール通知にのみ使用できます。
  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. 資格証明オブジェクトを作成し、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からの問合せ結果を電子メールとして送信

適用対象: 適用可能 Oracle Public Cloudのみ

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. 資格証明オブジェクトを作成し、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プロシージャを参照してください。