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についてもっと知りたい方は、上記のドキュメントを参照してください。
コメント
コメントを投稿