1. ホーム
  2. データベース
  3. 神託

Oracle PL/SQLを使用して電子メール機能(UTL_MAIL)を実装する方法

2022-01-18 04:33:47

皆さんこんにちは、ヘアカットの話ではなく、テクニックの話ばかりしている講師のトニーです。

Oracleデータベースのプログラムを開発しているとき、PL/SQLプロシージャでメールを送信する機能を実装しようとすると、おそらく3つの方法のどれかを使うことになると思います。

  • を使用する UTL_TCP パッケージを使用して、TCP プロトコルに基づくメールを送信します。このアプローチはより原始的で、ユーザーは基礎となる交換コードを書く必要があります。
  • を使用することで UTL_SMTP パッケージを使用すると、SMTP プロトコルに基づいて電子メールを送信できます。この方法は、TCP操作をエンコードするよりもはるかに簡単で、メール送信のためのさまざまな操作をサポートしているため、非常に広く利用されています。
  • を使用することで UTL_MAILパッケージによるメール送信 . この方法は最もシンプルで、一般的なメール機能をサポートし、SMTPプロトコルの知識も必要ありません。

本日は3つ目の方法として、Oracle 10gから提供されているUTL_MAILパッケージを利用して、PL/SQLプログラム内にメール送信機能を実装する方法を取り上げます。

UTL_MAILのインストール

デフォルトでは、UTL_MAILパッケージはシステムにインストールされません。これは、SMTP_OUT_SERVER 設定パラメータを設定する必要があり、セキュリティ上の問題があるためである。

まず、以下の文を実行して、UTL_MAIL パッケージをインストールします。

sqlplus sys/<pwd>
SQL> @$ORACLE_HOME/rdbms/admin/utlmail.sql
SQL> @$ORACLE_HOME/rdbms/admin/prvtmail.plb

次に、SMTP_OUT_SERVERパラメータを設定します。

sqlplus sys/<pwd>
SQL> ALTER SYSTEM SET smtp_out_server='smtp.domain.com' SCOPE=SPFILE;

Oracle 10g R1 を使用している場合、サービスを再起動する必要があります。それ以上のバージョンでは再起動する必要はありません。

<ブロッククオート

外部のメールサーバーに直接接続するのではなく、データベースサーバーにメール転送装置を設置することをお勧めします。メール転送の設定は非常に簡単で、localhostのSMTP_OUT_SERVERパラメータを参照する設定にします。外部メールサーバーに接続するための複雑な設定は、メール転送の設定に隠されています。

メールの送信

インストールと設定が完了したら、UTL_MAIL.SENDプロシージャを使ってメールを送信してみましょう。

UTL_MAIL.SEND (
   sender IN VARCHAR2 CHARACTER SET ANY_CS,
   recipients IN VARCHAR2 CHARACTER SET ANY_CS,
   cc IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
   bcc IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
   subject IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
   message IN VARCHAR2 CHARACTER SET ANY_CS,
   mime_type IN VARCHAR2 DEFAULT 'text/plain; charset=us-ascii',
   priority IN PLS_INTEGER DEFAULT 3,
   replyto IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);

これらのパラメータは次のように動作します。

  • SENDER:送信者の電子メールアドレス
  • RECIPIENTS:受信者の電子メールアドレス(複数のアドレスをカンマで区切って入力
  • CC: 送信者のメールアドレス、カンマで区切られた複数のアドレス、デフォルトはNULL
  • BCC: Bccのメールアドレス、複数のアドレスはカンマで区切られる、デフォルトはNULL
  • SUBJECT: メールの件名、デフォルトはNULL
  • MESSAGE:メッセージの本文
  • MIME_TYPE:メッセージのMIMEタイプ、デフォルトはtext/plain; charset=us-ascii。
  • PRIORITY: メッセージの優先度、最高はレベル1、最低はレベル5、デフォルトは3
  • REPLYTO: 返信メールの送信先アドレス、Oracle 11g R2 でサポートされます。

以下は、電子メールを送信する簡単な例です。

BEGIN
  UTL_MAIL.send(sender => '[email protected]',
                recipients => '[email protected],[email protected]',
                cc => '[email protected]',
                bcc => '[email protected]',
                subject => 'UTL_MAIL test',
                message => 'email_body',
                mime_type => 'text/plain; charset=UTF-8'); -- Chinese language support
END;
/

添付ファイルの送信

テキストメッセージの送信に加えて、UTL_MAIL パッケージは添付ファイルをサポートする 2 つのプロシージャを提供します。SEND_ATTACH_RAW と SEND_ATTACH_VARCHAR2 です。これらは、それぞれ RAW および VARCHAR2 形式の添付ファイルを送信するために使用できる。

UTL_MAIL.SEND_ATTACH_RAW (
   sender IN VARCHAR2 CHARACTER SET ANY_CS,
   recipients IN VARCHAR2 CHARACTER SET ANY_CS,
   cc IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
   bcc IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
   subject IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
   message IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
   mime_type IN VARCHAR2 DEFAULT CHARACTER SET ANY_CS
                              DEFAULT 'text/plain; charset=us-ascii',
   priority IN PLS_INTEGER DEFAULT 3,
   attachment IN RAW,
   att_inline IN BOOLEAN DEFAULT TRUE,
   att_mime_type IN VARCHAR2 CHARACTER SET ANY_CS 
                                           DEFAULT 'text/plain; charset=us-ascii',
   att_filename IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
   replyto IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);

UTL_MAIL.SEND_ATTACH_VARCHAR2 (
   sender IN VARCHAR2 CHARACTER SET ANY_CS,
   recipients IN VARCHAR2 CHARACTER SET ANY_CS,
   cc IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
   bcc IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
   subject IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
   message IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
   mime_type IN VARCHAR2 CHARACTER SET ANY_CS 
                                           DEFAULT 'text/plain; charset=us-ascii',
   priority IN PLS_INTEGER DEFAULT 3,
   attachment IN VARCHAR2 CHARACTER SET ANY_CS, ,
   att_inline IN BOOLEAN DEFAULT TRUE,
   att_mime_type IN VARCHAR2 CHARACTER SET ANY_CS 
                                           DEFAULT 'text/plain; charset=us-ascii',
   att_filename IN VARCHAR2CHARACTER SET ANY_CS DEFAULT NULL,
   replyto IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);

これら2つのストアドプロシージャは、UTL_MAIL.SENDを超える以下の追加パラメータをサポートしています。

  • ATTACHMENT: 添付ファイルの内容、データ型はRAWまたはVARCHAR2
  • ATT_INLINE: 添付ファイルをメッセージの本文中で明示的に表示するかどうかを指定、デフォルトは TRUE
  • ATT_MIME_TYPE: 添付ファイルのMIMEタイプ、デフォルトは 'application/octet' または 'text/plain; charset=us-ascii' です。
  • ATT_FILENAME: 添付ファイルのファイル名、デフォルトはNULL

以下は、テキストの添付ファイルを送信する場合の例です。

BEGIN
  UTL_MAIL.send(sender => '[email protected]',
                recipients => '[email protected],[email protected]',
                cc => '[email protected]',
                bcc => '[email protected]',
                subject => 'UTL_MAIL test',
                message => 'email_body',
                mime_type => 'text/plain; charset=UTF-8', -- Chinese language support
                attachment => 'attachment content',
                att_mime_type => 'text/plain; charset=UTF-8', -- Chinese language support
                att_filename => 'attachment.txt');
END;
/

注意事項

UTL_MAILパッケージは呼び出し側特権を使用します。つまり、プログラムを使用するユーザーは外部のメールサーバーにアクセスできる必要があります。

以下のようなエラーが発生した場合、適切な権限がないことを意味します。

<ブロッククオート

ORA-24247: アクセス制御リスト (ACL) によってネットワーク アクセスが拒否されました。

この時点で、指定されたユーザー(例:scott)に、外部サーバーのSMPTサービスへのアクセスを以下のステートメントで許可することができます。

BEGIN;

DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
  host => 'www.domain.comm',
  ace => xs$ace_type(privilege_list => xs$name_list('smtp'),
                       principal_name => 'scott',
                       principal_type => xs_acl.ptype_db)); 
END;
/

詳細は 公式ドキュメント .

Oracle PL/SQLを使ってメールを送信する方法(UTL_MAIL)については、この記事がすべてです。Oracle PL/SQLを使ったメール送信については、スクリプトハウスの過去記事を検索していただくか、引き続き以下の記事をご覧ください。