Oracle PL/SQLを使用して電子メール機能(UTL_MAIL)を実装する方法
皆さんこんにちは、ヘアカットの話ではなく、テクニックの話ばかりしている講師のトニーです。
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を使ったメール送信については、スクリプトハウスの過去記事を検索していただくか、引き続き以下の記事をご覧ください。
関連
-
オラクルデータベースに付属するすべてのテーブル構造を説明する(sqlコード)
-
LogMinerによるOracle Databaseの同期マイグレーション
-
Oracleのカンマ区切り文字列を複数行に分割したデータ例
-
[解決済み】Oracle Databaseで「SET DEFINE OFF」を使用するタイミングと理由
-
[解決済み] Oracle の起動ができません - ORA-00845: MEMORY_TARGET はこのシステムでサポートされていません - しかし、メモリサイズは問題ないようです。
-
[解決済み] ORA-00917: カンマ欠落エラー [終了しました]。
-
[解決済み] ORA-01849: 時間は 1 から 12 の間でなければなりません。
-
[解決済み] libclntsh.so.11.1: 共有オブジェクト・ファイルを開くことができません。
-
[解決済み] PLS-00382: 式が不正です。
-
[解決済み] 1行のみ追加 "ORA-02290: チェック制約 (SYS_C0012762) 違反 ORA-01403: データが見つかりません"
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Oracle Dbeaver ストアドプロシージャの構文説明
-
PLSQLは、ローカルオラクルまたはリモートオラクルデータベースに接続し、ランダムスイッチ機能を実現します。
-
Oracle Sqlplusコマンドログイン複数方法ケーススタディ
-
オラクルインデックス概要
-
オラクルストアドプロシージャの事例を解説
-
SQLPlusコマンドの使い方の説明
-
[解決済み] ORA-01950: テーブルスペース 'USERS' に特権がありません [閉鎖]。
-
[解決済み] このPL/SQLは何が問題なのでしょうか?バインド変数 * が DECLARED ではありません。
-
[解決済み] BATCHEDのインデックスによるテーブルアクセスとROWIDのインデックスによるテーブルアクセスの違い
-
[解決済み] ORA-01830: 入力文字列全体を変換する前に日付書式画像が終了する / Select sum where date query