Autonomous DatabaseでUTL_SMTPを使用してメールを送信する方法 (2020/01/10)

Autonomous DatabaseでUTL_SMTPを使用してメールを送信する方法 (2020/01/10)

https://blogs.oracle.com/datawarehousing/post/send-email-autonomous-database

投稿者: Can Tuzla | Principal Product Manager


Autonomous Database は UTL_HTTP と UTL_SMTP PL/SQL パッケージをサポートするようになりました。これらは様々なシナリオで一般的に使用されているため、既にご存知の方もいらっしゃるかもしれません。このブログでは、UTL_SMTP パッケージを使用して電子メールを送信する方法に焦点を当てます。詳細を説明する前に、どちらのパッケージにも一定の制約があることを確認しておきましょう。ここではそのいくつかを取り上げますが、ドキュメントのSending Email on Autonomous Database and PL/SQL Packages with Restrictionsを参照するとよいでしょう。


UTL_SMTP パッケージは Simple Mail Transfer Protocol (SMTP) によるメール送信のために設計されており、SMTP コマンドへの多数のインタフェースを提供しています (詳細は UTL_SMTP を参照)。これらのインターフェースのおかげで、実際、データベース内からメールを送信することは非常に簡単です。しかし、先に述べたように、いくつか注意しなければならない制約があります。例えば、現在サポートされているメールプロバイダーは、Oracle Cloud Infrastructure(OCI)のEmail Deliveryサービスのみです。つまり、Autonomous Database(ADB)でメール送信を行うには、事前にEmail Deliveryの設定を行う必要があるのです。さあ、はじめましょう


ここでは、ADBでメール送信を成功させるための手順を説明します。


  •     Email Deliveryサービスの設定
  •     アクセス制御エントリ(ACE)を介してADMINのSMTPアクセスを許可
  •     電子メールを送信するPL/SQLプロシージャを作成 (新しいUTL_SMTP.SET_CREDENTIALプロシージャを使用して12/21/22に更新されました)
  •     テストメールの送信



Email Deliveryサービスの設定


Oracle Cloud Infrastructure Email Deliveryは、大量のメールを送信するための高速で信頼性の高いマネージドソリューションを提供するメール送信サービスです(詳細は「Email Deliveryサービスの概要」を参照)。この手順では、下図のようにOCIコンソールでEmail Deliveryを設定します。


  • ユーザー用のSMTP認証情報を生成
    •     ナビゲーションメニューを開きます。Governance and Administration]の下にある[Identity]に移動し、[Users]をクリックします。電子メールを管理する権限を持つユーザーをリストで探し、ユーザー名をクリックして詳細を表示します。
    •     [SMTP Credentials]をクリックします。
    •     Generate SMTP Credentials (SMTP認証情報の生成)をクリックします。
    •     ダイアログボックスに SMTP クレデンシャルの説明を入力します。
    •     Generate SMTP Credentials をクリックします。ユーザー名とパスワードが表示されます。


注:新しいユーザーを作成する場合(「ユーザーの追加」を参照)、または既存のユーザーを使用してこれらの手順を実行する場合、そのユーザーが承認済み送信者と抑制を管理する権限を持つグループに割り当てられていることを確認する必要があります(詳細については、「権限の設定」を参照)。たとえば、この例のユーザーは、承認済み送信者と抑制について次のようなポリシーを持つグループに割り当てられています。


Allow group <Your Group Name> to manage approved-senders in tenancy

Allow group <Your Group Name> to manage suppressions in tenancy


  • メール配信の承認済み送信者を作成します。UTL_SMTP.MAILでFromとして使用するすべての電子メールアドレスについて、この作業を行う必要があります(詳細については、「承認済み送信者の管理」を参照してください)。
    •     ナビゲーションメニューを開きます。[Solutions and Platform]の[Email Delivery]で、[Email Approved Senders]をクリックします。
    •     [Approved Senders]ビューで[Create Approved Sender]をクリックします。
    •     [承認済み送信者の作成]ダイアログボックスに、承認済み送信者としてリストアップする電子メールアドレスを入力します。
    •     [承認済み送信者の作成]をクリックします。承認済み送信者リストに電子メールアドレスが追加されます。



アクセスコントロールエントリ(ACE)によるADMINのSMTPアクセスの許可


次に、ADMINユーザが特定のホストとポートのSMTPにアクセスするために、DBMS_NETWORK_ACL_ADMINパッケージを使用してアクセス制御エントリ(ACE)を追加する必要があります。


注:SMTPエンドポイント(ホスト)と適格なポートは、ナビゲーション・メニューのEmail Delivery --> Email Configurationを開くことで見つけることができます。


begin
  -- Allow SMTP access for user ADMIN
  dbms_network_acl_admin.append_host_ace(
    host =>'smtp.us-ashburn-1.oraclecloud.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;
/


メール送信のためのPL/SQLプロシージャを作成


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


注意事項


  •     username: SMTPクレデンシャルのユーザー名を指定します。
  •     passwd: SMTPクレデンシャルのパスワードを指定します。
  •     msg_from: 承認された送信者のいずれかを指定します。
  •     mailhost: SMTP接続のエンドポイントを指定します。


12/21/22更新:お気づきのように、上記のSEND_MAILプロシージャは、SMTPサーバへの認証にUTL_SMTP.AUTHプロシージャを使用しています。しかし、この一般的なプロシージャはユーザ名とパスワードをプレーンテキストで受け取るため、スクリプトで使用する場合、セキュリティの観点から許容されない可能性があります。Autonomous Databaseでは、SMTPサーバのユーザ名/パスワードを完全に暗号化されたクレデンシャルオブジェクトとしてデータベースに保存し、新しいUTL_SMTP.SET_CREDENTIALプロシージャでSMTPサーバを認証することができるようになりました。この新しい認証プロシージャを使用すると、上記の例は以下のようになります。 


BEGIN DBMS_CLOUD.CREATE_CREDENTIAL (
  credential_name => 'SMTP_CRED',
  username        => 'ocid1.user.oc1.username',
  password        => '************' );
END;

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

  mail_conn utl_smtp.connection;
  smtp_cred varchar2(50):= 'SMTP_CRED';
  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.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(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;
/


テスト・メールの送信


すべての設定を正確に行い、動作するプロシージャ(SEND_MAIL)を作成したことを確認するために、テスト・メールを送信してみます。


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


要約すると、UTL_SMTPパッケージがAutonomous Databaseでサポートされ、このパッケージを利用してOCI Email Deliveryサービスを利用してメールを送信する方法を探ったところです。ADBでのメール配信やUTL_SMTPについてもっと知りたい方は、上記のドキュメントを参照してください。


コメント

このブログの人気の投稿

Oracle RACによるメンテナンスのためのドレインとアプリケーション・コンティニュイティの仕組み (2023/11/01)

Oracle Cloud Infrastructure Secure Desktopsを発表: デスクトップ仮想化のためのOracleのクラウドネイティブ・サービス (2023/06/28)

新しいOracle Container Engine for Kubernetesの機能強化により、大規模なKubernetesがさらに簡単になりました (2023/03/20)